android - 使用 Hilt 将 ViewModel 注入(inject) ViewModel

标签 android viewmodel dagger-hilt

我目前正在做一个大项目,我有一个 ViewModelA 使用 MediatorLiveData 来观察其他 LiveData 源。
我想让这个 ViewModelA 观​​察来自 ViewModelB 的数据。
解决此问题的一种方法是让 Fragment 同时使用 View 模型并在 ViewModelB 数据更改时更新 ViewModelA。

@AndroidEntryPoint
class FragmentA: Fragment() {

    //ViewModels
    private val viewModelA: ViewModelA by viewModels()
    private val viewModelB: ViewModelB by viewModels()

    onViewCreated... {
       viewModelA.someFunction().observe{
           viewModelB.someLiveData.value = it
       }
    }
}
但是我想出了另一个解决方案,我使用 Hilt 将 ViewModelB 注入(inject) ViewModelA 的构造函数。
class ViewModelA @ViewModelInject constructor(
        private val viewModelB: ViewModelB
) : ViewModel() {}
它目前有效,但我认为这不是一个好习惯。我在网上找不到太多关于这个问题的信息。
这会引起任何问题吗?

最佳答案

如果您从 ViewModelA 转发结果,您可以达到同样的效果。至ViewModelB .这将为您带来分离的好处, View 模型不会交织在一起并提高可测试性。 ViewModelA不应该知道谁在消费结果。viewModela.myLiveData.observe(viewLifecycleOwner, viewModelB::onDataRetrieved)onDataRetrieved您将有自己的调用逻辑 viewModelB.someLiveData

关于android - 使用 Hilt 将 ViewModel 注入(inject) ViewModel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65704356/

相关文章:

android - 我想使用 mediaplayer 来录制声音,然后计算 "amplitude"以随着声音的变化上下移动 Bars

android - 如何从 google play 获取我自己的应用程序列表

android - 通过构建器注入(inject)的 Hilt 适配器为空

android - 当我使用 HILT 时 Workmanager 未启动

android - jetpack compose viewModel() 给出错误 "has no zero argument constructor"带柄

android - 使用 HTML5 访问 iOS 和 Android 手机中的相机

android - Xamarin Forms 主详细信息页面将返回按钮更改为汉堡菜单

apache-flex - 避免 View 模型中的重复数据和计算

asp.net-mvc-3 - 是否可以将太多存储库注入(inject) Controller ?

c# - 忽略使用 Automapper 映射一个属性