Android Dagger片段可以访问AppModule和ActivityModule依赖关系,但不能访问FragmentModule依赖关系

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android Dagger片段可以访问AppModule和ActivityModule依赖关系,但不能访问FragmentModule依赖关系相关的知识,希望对你有一定的参考价值。

我有一个使用Dagger 2且具有AppScope的应用程序,该应用程序的下面具有ActivityScope,而该ActivityScope包含FragmentScope。可以使用AppModule的@Provides方法和ActivityModule注入Fragment @Inject字段,但不能使用FragmentModule内部的@Provides方法注入。

我确保在Fragment的子组件中包含FragmentModule。同样,也不必确保Fragment在活动和应用程序下的作用域正确,因为已经成功地从其模块中获取了依赖项。

这里是FragmentModule:

@Module
class SecondFragmentModule {

    @Module
    companion object {
        @JvmStatic
        @Provides
        fun provideString() : String {
            return "string"
        }
    }
}

这里是FragmentBuildersModule

@Module
abstract class FragmentsBuilderModule {

    @ContributesandroidInjector
    abstract fun contributeFirstFragmentFragment() : FirstFragment

    @ContributesAndroidInjector(modules = [SecondFragmentModule::class])
    abstract fun contributeSecondFragment() : SecondFragment

    @ContributesAndroidInjector
    abstract fun contributeSettingsFragment() : SettingsFragment
}

这里是ActivityBuilderModule,其中包含FragmentsBuildersModule,您可以通过c:

@Module
abstract class ActivityBuildersModule {

    @ContributesAndroidInjector(modules = [
        ActivityViewModelModule::class,
        ActivityModule::class,
        FragmentsBuilderModule::class,
        FragmentsViewModelsModule::class
    ])
    abstract fun contributeHomeActivity() : HomeActivity
}

注意:在实际项目中,拼写完全没有错误,我不得不更改一些名称以使问题更笼统,并使开发人员更容易尝试提供帮助,这可能会导致拼写错误,但这项目本身不是这种情况。

编辑:

[抱歉,我检查了它们正常注入的Fragment中的@Inject字段,我的问题是FragmentViewModel所需的Repository的@Inject构造函数,该存储库的字段不能从FragmentModule的依赖项中注入,但是可以仅从ActivityModule和AppModule的部门注入。

ViewModel类:注入存储库没有任何问题,因为存储库具有@Inject构造函数

class FragmentViewModel @Inject constructor(var repository: 
    FragmentRepository) : ViewModel() {

    lateinit var mediatorLiveData:MediatorLiveData<MutableList<POJO>>

    fun getDataFromApi() {
        mediatorLiveData = repository.getDataFromApi()
    } 
}

存储库类:

class FragmentRepository @Inject constructor(var database: 
FirebaseFirestore, var collectionName: String) {

    private val mediatorLiveData:MediatorLiveData<MutableList<POJO>> = MediatorLiveData()

    fun getDataFromApi() : MediatorLiveData<MutableList<POJO>> {
        val dataListLD: MutableList<POJO> = ArrayList()
        database
            .collection(collectionName)
            .get()
            .addOnSuccessListener { result ->
                for (document in result) {
                    val dataObj = document.toObject(POJO::class.java)
                    dataListLD.add(dataObj)
                }
                mediatorLiveData.value = dataListLD
            }
        return mediatorLiveData
    }
}

当我尝试@提供FragmentModule中存储库所需的依赖项时,出现此错误:

error: method create in class MasjidsRepository_Factory cannot be 
applied to given types;
required: 
Provider<FirebaseFirestore>,Provider<String>,Provider<Masjid>
found:AppModule_ProvideFirestoreDatabaseFactory,HomeModule_ProvideMasjidFactory
reason: actual and formal argument lists differ in length
答案

我发现了问题,存储库是viewModel的一个dep,它被错误地放在HomeScope中,因此我能够使用ActivityModule和上述任何范围(AppScope)中的deps。

错误是我将片段的ViewModelModule放置在Activity的子组件内,只是将每个片段ViewModelModule移到了它的子组件中,并且它起作用了。

以上是关于Android Dagger片段可以访问AppModule和ActivityModule依赖关系,但不能访问FragmentModule依赖关系的主要内容,如果未能解决你的问题,请参考以下文章

Dagger 2 注入 Android 应用程序上下文

Android Annotations生成类,但dagger2 @Module类无法访问这些类

Dagger-我们是不是应该为每个活动/片段创建每个组件和模块

Dagger 2 无法访问 Retrofit

Dagger 2:在片段中调用onAttach之前,注入的对象可能仍为null

dagger2 和 kotlin 的 Android 单元测试问题