Dagger2 在 activity 中注入 lateinit var presenter 不工作
Dagger2 inject lateinit var presenter in activity not working
我想在我的 mvp 模式中使用 dagger,
但是当我调用它的函数时,lateinit presenter 不会被初始化。
演示者不是私人的。
这是我的 dagger ViewModule,它提供 activity 作为演示者的视图
@Module
class ViewModule {
@Provides
fun provideAView(): AView = MainActivity()
}
PresenterModule
@Module
class PresenterModule {
@Provides
fun provideAPresenter(repo: ARepo, view: AView): APresenter = APresenter(repo, view)
}
回购模块
@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()
}
您需要在 Component
接口的 inject(...)
方法中指定确切的类型。否则,成员将不会被注入。 (请参阅此 comment 了解更多说明)
因此,将您的组件 class 更改为:
@Component(modules = [PresenterModule::class, RepoModule::class, ViewModule::class])
@Singleton
interface PresenterComponent {
fun injectMain(view: MainActivity) //<-- The AView is changed to MainActivity
}
我想在我的 mvp 模式中使用 dagger, 但是当我调用它的函数时,lateinit presenter 不会被初始化。 演示者不是私人的。
这是我的 dagger ViewModule,它提供 activity 作为演示者的视图
@Module
class ViewModule {
@Provides
fun provideAView(): AView = MainActivity()
}
PresenterModule
@Module
class PresenterModule {
@Provides
fun provideAPresenter(repo: ARepo, view: AView): APresenter = APresenter(repo, view)
}
回购模块
@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()
}
您需要在 Component
接口的 inject(...)
方法中指定确切的类型。否则,成员将不会被注入。 (请参阅此 comment 了解更多说明)
因此,将您的组件 class 更改为:
@Component(modules = [PresenterModule::class, RepoModule::class, ViewModule::class])
@Singleton
interface PresenterComponent {
fun injectMain(view: MainActivity) //<-- The AView is changed to MainActivity
}