dagger2 不提供基本活动的注入

时间:2021-02-11 07:42:29

标签: android dependency-injection dagger-2

我正在尝试在单活动应用程序中实现最新版本的 Dagger2,但不知道为什么,在初始化我的启动活动时,Dagger2 没有注入依赖项,我有一个 我的基本活动中的致命错误:无法恢复活动 kotlin.UninitializedPropertyAccessException:lateinit 属性 navigatorHolder 尚未初始化

这是我的代码

应用组件:

@Singleton
@Component(modules = [
AndroidSupportInjectionModule::class,
ActivityInjectionModule::class,
ActivityProviderModule::class,
AndroidInjectionModule::class,
NetworkModule::class,
RemoteModule::class,
NavigationModule::class,
ParserModule::class,
CacheModule::class])

interface AppComponent : AndroidInjector<App> {

@Component.Builder
interface Builder {
    @BindsInstance
    fun application(application: Application): Builder
    @BindsInstance
    fun context(context: Context) : Builder
    fun build(): AppComponent
}

override fun inject(app: App)

}

应用:

class App : DaggerApplication(){
private val applicationInjector = 
DaggerAppComponent.builder().application(this).context(this).build()
override fun applicationInjector(): AndroidInjector<out DaggerApplication>  = 
applicationInjector


companion object {
    lateinit var cicerone: Cicerone<Router>
        private set
}
override fun onCreate() {
    super.onCreate()
    cicerone = Cicerone.create()
    initAppComponent()
    initStetho()
    Timber.plant(Timber.DebugTree())
}

应用活动:

class AppActivity : MvpAppCompatActivity() , HasAndroidInjector, RouterProvider {

@Inject
lateinit var dispatchingAndroidInjector: DispatchingAndroidInjector<Any>

@Inject
lateinit var mainActivityProvider: ActivityProvider


@Inject
lateinit var navigatorHolder: Lazy<NavigatorHolder>

@Inject
override lateinit var ciceroneRouter: Router

override fun androidInjector(): AndroidInjector<Any>  = dispatchingAndroidInjector

private val navigator : Navigator by lazy {
    CustomSupportAppNavigator(this, supportFragmentManager, R.layout.activity_main)
}

override fun onCreate(savedInstanceState: Bundle?, persistentState: PersistableBundle?) {
    AndroidInjection.inject(this)
    mainActivityProvider.acitvity = this

    Timber.e("onCreate AppActivity")
    super.onCreate(savedInstanceState, persistentState)
    setContentView(R.layout.activity_main)
    initBottomBar()
}
override fun onResumeFragments() {
    super.onResumeFragments()
    navigatorHolder.get().setNavigator(navigator)
}

ActivityInjectionModule

@Module(includes = [AndroidInjectionModule::class])
interface ActivityInjectionModule {

@ContributesAndroidInjector(
    modules = [FragmentInjectionModule::class]
)
fun activityInjector() : AppActivity
}

导航模块

@Module
class NavigationModule {

@Provides
@Singleton
fun provideRouter() = App.cicerone.router

@Provides
@Singleton
fun provideNavigatorHolder() : NavigatorHolder {
    return App.cicerone.navigatorHolder
}

@Provides
@Singleton
fun provideLocalNavigationHolder(): LocalCiceroneHolder {
    return LocalCiceroneHolder()
}
}

我也在android清单中发布了android:name=".App"。

我已经尝试了很多不同的选择,但我仍然找不到原因

1 个答案:

答案 0 :(得分:0)

你能不能把你的应用改成这样然后再试一次:

class App : DaggerApplication(){

private val appComponent = 
DaggerAppComponent.builder().application(this).context(this).build().inject(this)

companion object {
    lateinit var cicerone: Cicerone<Router>
        private set
}
override fun onCreate() {
    super.onCreate()
    cicerone = Cicerone.create()
    initAppComponent()
    initStetho()
    Timber.plant(Timber.DebugTree())
}

同时从 AppComponent 中删除 AndroidInjector<App>