Dagger2没有注入

时间:2017-09-24 21:05:20

标签: android kotlin dagger-2

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

AppComponent

@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属性演示器尚未初始化,这意味着“Inject”不起作用

2 个答案:

答案 0 :(得分:2)

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

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

SplashActivity的{​​{1}}方法中(当然,在使用演示者之前)。

其次,您的演示者需要一个构造函数来告诉Dagger如何构建/“构建”演示者,这意味着使用onCreate()注释注释的构造函数,所以:

@Inject

答案 1 :(得分:1)

你忘了注入SplashActivity:

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