小编Oma*_*tom的帖子

使用 Dagger 跨两个/或多个片段和活动共享 ViewModel

好吧,正如我试图在标题中总结的那样,这里是细节。

我们有一个相对较大的应用程序,它以非常不理想的方式使用 Dagger,因此我们决定开始编写测试,为此,我需要公开 Mockito 的依赖项,因此,我面临一个问题,即开始使用单例工厂,仍然适用,并且有大量教程可以解释这一点。

我们在我们的应用程序中拥有许多使用单个活动和导航组件实现的功能,该单个活动有时会创建一个视图模型,用于在容器活动和使用导航填充的片段之间共享数据编辑。

我想不通的是,如何使用 dagger 注入共享视图模型,每次调用@Inject特定视图模型时都返回相同的实例,我知道这可能可以通过范围完成,但我想不通,我有一个解释,我需要验证。(我将在下面提供我的代码)

我首先按如下方式实现我的 Singleton ViewModelFactory:

@Singleton
class ViewModelFactory @Inject constructor(private val creators: Map<Class<out ViewModel>,
        @JvmSuppressWildcards Provider<ViewModel>>) : ViewModelProvider.Factory {
    override fun <T : ViewModel?> create(modelClass: Class<T>): T {
        val creator = creators[modelClass] ?: creators.entries.firstOrNull {
            modelClass.isAssignableFrom(it.key)
        }?.value ?: throw IllegalArgumentException("unknown model class $modelClass")
        try {
            @Suppress("UNCHECKED_CAST")
            return creator.get() as T
        } catch (e: Exception) {
            throw RuntimeException(e)
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

然后我创建了我的 ViewModelModule,它提供了 ViewModelFactory 和 ViewModel,如下所示:

@Module
abstract class ViewModelFactoryModule {

    @Binds …
Run Code Online (Sandbox Code Playgroud)

android dagger-2

3
推荐指数
2
解决办法
2634
查看次数

标签 统计

android ×1

dagger-2 ×1