Dagger 2 + Kotlin无法将Presenter插入到View中

我正在尝试使用Dagger 2创建简单的MVP构建应用程序。我正在试图获得与本教程中相同的结果,但使用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() } } 

匕首模块:

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

匕首组件:

 @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匕首配置:

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

编辑:改变注入的主持人types从IMainView到主视图。

每当试图注入任何接口,就像在你的情况下IMainPresenter ,你需要告诉匕首使用哪个具体的实现。 匕首无法知道你想要“拥有”那个接口的实现(你可能有很多这个接口的实现)。

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

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