Dagger 2 + Kotlin无法将Presenter注入视图

时间:2017-11-25 22:13:26

标签: android kotlin dagger-2

我正在尝试使用Dagger 2创建简单的MVP Archtecture应用程序。我想要获得与本教程中相同的结果,但是使用Kotlin。到目前为止,这是我的代码。

主讲人:

class MainPresenter @Inject constructor(var view: IMainView): IMainPresenter{

override fun beginMessuring() {
    view.toastMessage("Measuring started")
}

override fun stopMessuring() {
    view.toastMessage("Measuring stopped")
}

}

查看:

class MainActivity : AppCompatActivity(), IMainView {

@Inject lateinit var presenter : MainPresenter

val component: IMainComponent by lazy {
    DaggerIMainComponent
            .builder()
            .mainPresenterModule(MainPresenterModule(this))
            .build()
}

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)
    component.inject(this)
    presenter.beginMessuring()
}

override fun toastMessage(message: String) {
    Toast.makeText(this, message, Toast.LENGTH_LONG).show()
}
}

Dagger模块:

@Module
class MainPresenterModule(private val view: IMainView) {
    @Provides
    fun provideView() = view
}

Dagger组件:

@Component(modules = arrayOf(MainPresenterModule::class))
interface IMainComponent {
    fun inject(mainView : IMainActivity)
}

问题是我遇到了以这个开头的构建错误:

java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.maciej.spiritlvl/com.example.maciej.spiritlvl.View.MainActivity}: kotlin.UninitializedPropertyAccessException: lateinit property presenter has not been initialized

PS,我的gradle dagger配置:

kapt 'com.google.dagger:dagger-compiler:2.9'
mplementation 'com.google.dagger:dagger:2.9'

编辑: 将注入的Presenter类型从IMainView更改为MainView。

1 个答案:

答案 0 :(得分:1)

每当尝试注入任何接口时,就像你的情况pip show <module name>一样,你需要告诉dagger使用哪种具体实现。 Dagger无法知道您希望哪个界面的实现具有&#39; (您可能有许多该接口的实现)。

通过向模块添加IMainPresenter - 注释方法,您为IMainView做了正确的事情。你可以为你的演示者做同样的事情,但是那个imho会使整个匕首无用,因为你必须在创建模块时自己创建演示者。

因此,我会注入具体的实现@Provides,而不是将IMainPresenter接口注入到您的活动中。那么你也不需要在模块中使用MainPresenter方法(对于演示者)。