【问题标题】:Dagger2 inject lateinit var presenter in activity not workingDagger2在活动中注入lateinit var Presenter不起作用
【发布时间】:2019-07-15 18:18:46
【问题描述】:

我想在我的 mvp 模式中使用 dagger, 但是当我调用它的函数时,lateinit 演示者不会初始化。 演示者不是私人的。

这是我的匕首 ViewModule,它提供活动作为演示者的视图

@Module
class ViewModule {

    @Provides
    fun provideAView(): AView = MainActivity()
}

PresenterModule

@Module
class PresenterModule {

    @Provides
    fun provideAPresenter(repo: ARepo, view: AView): APresenter = APresenter(repo, view)



}

RepoModule

@Module
class RepoModule {

    @Provides
    fun provideARepo(): ARepo = ARepo()
}

还有我的 APresenter 构造函数

class APresenter @Inject constructor(var repo: ARepo, var view: AView) {

    fun showHelloWorld() {
        val i = repo.repo()
        Log.d("main", "aPresenter repo : $i")
        view.helloWorld()
    }
}

组件

@Component(modules = [PresenterModule::class, RepoModule::class, ViewModule::class])
@Singleton
interface PresenterComponent {
    fun injectMain(view: AView)
}

实现AView接口并注入presenter的MainActivity

class MainActivity : AppCompatActivity(), AView, BView {

    @Inject
    lateinit var aPresenter: APresenter


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

        val component = DaggerPresenterComponent.create()
        component.injectMain(this)

        // but this presenter will not init at this time and cause
        // lateinit property not init exception.
        aPresenter.showHelloWorld()
}

【问题讨论】:

  • fun provideAView(): AView = MainActivity() 你不能这样做,MainActivity 是系统创建的,而不是你
  • 我按照@mouse 所说的做了,确实解决了问题。谢谢!

标签: android kotlin dagger-2


【解决方案1】:

您需要在Component 接口的inject(...) 方法中指定确切的类型。否则,成员将不会被注入。 (更多解释请参见comment

所以把你的组件类改成这样:

@Component(modules = [PresenterModule::class, RepoModule::class, ViewModule::class])
@Singleton
interface PresenterComponent {
    fun injectMain(view: MainActivity) //<-- The AView is changed to MainActivity
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多