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依赖关系的主要内容,如果未能解决你的问题,请参考以下文章
Android Annotations生成类,但dagger2 @Module类无法访问这些类
Dagger-我们是不是应该为每个活动/片段创建每个组件和模块