【问题标题】:Dagger2 not injectDagger2 不注入
【发布时间】:2017-09-24 21:05:19
【问题描述】:

我是 android 新手并尝试使用 Dagger2。我花了整夜,仍然不知道为什么我的匕首不提供主持人。这是我的代码(我使用 Kotlin)

应用组件

@Singleton
@Component(modules = arrayOf(PresenterModule::class))
interface AppComponent {

    fun inject(target: SplashActivity)

}

PresenterModule

@Module
class PresenterModule {

    @Provides
    @Singleton
    fun provideSplashPresenter(): SplashPresenter {
        return SplashPresenter()
    }
}

应用程序

class App: Application() {

    companion object {
        lateinit var appComponent: AppComponent
    }

    override fun onCreate() {
        super.onCreate()
        appComponent = initDagger()
    }

    private fun initDagger(): AppComponent {
        return DaggerAppComponent.create()
    }
}

这是演讲者

class SplashPresenter: BasePresenterImpl<SplashContract.View>(), SplashContract.Presenter {

    override fun performToast(mess: String) {
        logi("abc", "performToast")
        logi("abc", "mess: " + mess)
        mView?.showLoading()
        if (mess.isNullOrBlank()) {
            mView?.showTosat("this is empty mess") ?: logi("abc", "null")
        } else {
            mView?.showTosat(mess) ?: logi("abc", "null")
        }
        mView?.hideLoading()

    }
}

最后,这是我的 SplashActivity

class SplashActivity : BaseActivity(), SplashContract.View {


    @Inject
    lateinit var presenter: SplashPresenter

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_splash)

        presenter.attachView(this)

        //TODO: check log in
        //TODO: If logged in => start main screen
        //TODO: If not logged in => load login activity

        button.setOnClickListener{
            presenter.performToast(editText.text.toString())
            logi("abc", "perform clicked")
        }
    }
}

当我运行这些代码时,我得到了这个错误 Lateinit 属性presenter没有初始化,说明“Inject”不起作用

【问题讨论】:

    标签: android kotlin dagger-2


    【解决方案1】:

    由于您在这里没有使用构造函数注入(您不能这样做,因为您不“拥有”活动的构造函数)Dagger 不“知道”它必须向您的Activity 注入一些东西。 您必须像这样手动注入:

    (applicationContext as App).appComponent.inject(this) 
    

    在您的SplashActivityonCreate() 方法中(当然是在使用演示者之前)。

    其次,你的presenter需要一个构造函数来告诉Dagger如何构造/'build'presenter,这意味着一个带有@Inject注解的构造函数,所以:

    class SplashPresenter @Inject constructor(): BasePresenterImpl<SplashContract.View>(), SplashContract.Presenter 
    

    【讨论】:

      【解决方案2】:

      你忘了注入 SplashActivity:

      override fun onCreate(savedInstanceState: Bundle?) {
          super.onCreate(savedInstanceState)
          App.appComponent.inject(this)
          setContentView(R.layout.activity_splash)
          ...
      

      【讨论】:

        猜你喜欢
        • 2017-06-24
        • 2019-01-13
        • 2018-01-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多