【问题标题】:Android Dagger fragment can access AppModule and ActivityModule dependencies but can't access FragmentModule dependenciesAndroid Dagger Fragment 可以访问 AppModule 和 ActivityModule 依赖但不能访问 FragmentModule 依赖
【发布时间】: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

【问题讨论】:

    标签: android dagger-2


    【解决方案1】:

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

    错误是我将片段的 ViewModelModule 放在了 Activity 的子组件中,只是将每个片段 ViewModelModule 移动到它的子组件中就可以了。

    【讨论】:

      猜你喜欢
      • 2019-05-08
      • 1970-01-01
      • 2018-09-16
      • 2017-07-29
      • 1970-01-01
      • 2016-11-01
      • 2019-01-24
      • 2018-11-30
      • 1970-01-01
      相关资源
      最近更新 更多