【发布时间】:2020-05-25 18:40:39
【问题描述】:
我有一个使用 Dagger 2 的应用程序,该应用程序具有 AppScope,其下方有 ActivityScope,而后者又包含 FragmentScope。 Fragment @Inject 字段可以使用 AppModule 的 @Provides 方法和 ActivityModule 注入,但不能使用 FragmentModule 内的 @Provides 方法注入。
我确保将 FragmentModule 包含在 Fragment 的子组件中。此外,无需确保 Fragment 在 Activity 和应用程序下的范围正确,因为它已经成功地从其模块中获取依赖项。
这是 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
}
这是包含 FragmentsBuildersModule 的 ActivityBuilderModule,你可以这样做:
@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 的 deps 注入。
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 中 @Provide 存储库所需的依赖项时,我收到此错误:
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
【问题讨论】: