【问题标题】:dagger2 does not provide injection in base activitydagger2 不提供基础活动注入
【发布时间】:2021-02-11 07:42:29
【问题描述】:

我正在尝试在单活动应用程序中实现最新版本的 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())
}

AppActivity:

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:name=".App" inandroid manifest。

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

【问题讨论】:

    标签: android dependency-injection dagger-2


    【解决方案1】:

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

    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&lt;App&gt;

    【讨论】:

    • 它没有帮助(
    猜你喜欢
    • 2017-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多