【问题标题】:Trouble with Dagger 2匕首2的问题
【发布时间】:2019-12-05 11:39:32
【问题描述】:

您好,我在我的项目中使用 dagger 2 进行此配置。

这是我的 SellerHubApplication.kt

class SellerHubApplication : Application(), HasAndroidInjector {

@Inject
lateinit var activityDispatchingAndroidInjector: AndroidInjector<Any>

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

override fun onCreate() {
    super.onCreate()

    DaggerAppComponent.builder()
        .application(this)
        .build()
        .inject(this)

    Fresco.initialize(applicationContext)
}

}

这是我的 AppComponent.kt

@Singleton
@Component(modules = [AndroidInjectionModule::class, ActivityBuilder::class, AppModule::class])
interface AppComponent {

    @Component.Builder
    interface Builder {
        @BindsInstance
        fun application(app: Application): Builder

        fun build(): AppComponent
    }

    fun inject(app: SellerHubApplication)

}

运行应用程序后,我收到此错误“错误:[Dagger/MissingBinding] dagger.android.AndroidInjector cannot be provided without an @Provides-annotated method.”

如果我将“有趣的注入(应用程序:SellerHubApplication)”更改为“有趣的注入(应用程序:应用程序)”,应用程序运行但它显示“activityDispatchingAndroidInjector 尚未初始化”。请帮我解决这个问题。

【问题讨论】:

    标签: android kotlin dagger


    【解决方案1】:

    尝试这样做:

    应用组件:

    @Singleton
    @Component(modules = [AndroidInjectionModule::class, ActivityBuilder::class, AppModule::class, FragmentBuilder::class,])
    interface AppComponent : AndroidInjector< SellerHubApplication > {
    
        @Component.Builder
        interface Builder {
            @BindsInstance
            fun application(application: SellerHubApplication): Builder
    
            fun applicationModule(applicationModule: AppModule): Builder
            fun build(): AppComponent
        }
    }
    

    应用:

    class SellerHubApplication : Application(), HasActivityInjector, HasSupportFragmentInjector {
    
        @Inject
        lateinit var dispatchingAndroidInjector: DispatchingAndroidInjector<Activity>
    
        @Inject
        lateinit var fragmentInjector: DispatchingAndroidInjector<Fragment>
    
    
        companion object {
            lateinit var applicationComponent: AppComponent
                private set
        }
    
    
        override fun onCreate() {
            super.onCreate()
    
            init()
        }
    
        override fun activityInjector(): AndroidInjector<Activity> {
            return dispatchingAndroidInjector
        }
    
        override fun supportFragmentInjector(): AndroidInjector<Fragment> {
            return fragmentInjector
        }
    
    
        private fun init() {
            initDagger()
        }
    
        private fun initDagger() {
            applicationComponent = DaggerAppComponent
                    .builder()
                    .application(this)
                    .applicationModule(AppModule(this))
                    .build()
    
            applicationComponent.inject(this)
        }
    
    }
    

    应用模块:

    @Module
    class AppModule(private val application: SellerHubApplication) {
    
        @Provides
        @Singleton
        fun provideApplication(): Application {
            return application
        }
    }
    

    【讨论】:

    • 我正在使用最新版本的匕首。它没有 HasActivityInjector、HasSupportFragmentInjector。我将降低匕首版本并尝试一下。您对此还有其他解决方案吗?
    • 只需将它们替换为 HasAndroidInjector,并相应地更改变量。
    • 我明白了。我在 SellerHubApplication 中使用 AndroidInjector 和 AndroidInjector 实现 AppComponent 作为 DispatchingAndroidInjector。我终于明白了。感谢您的帮助。
    猜你喜欢
    • 2020-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-04
    • 2015-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多