使用Hilt将ViewModel注入到另一个ViewModel中

10

我目前正在从事一个大型项目,其中有一个ViewModelA使用MediatorLiveData来观察其他LiveData数据源。

我希望这个ViewModelA能够观察ViewModelB的数据。

解决此问题的一种方法是使Fragment使用这两个ViewModel,并在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 注入到 ViewModelA 的构造函数中。

class ViewModelA @ViewModelInject constructor(
        private val viewModelB: ViewModelB
) : ViewModel() {}

它目前能够工作,但我认为这不是一种好的做法。在网上找不到关于这个问题的太多信息。 这会引起任何问题吗?


你能分享一些使用Hilt实现这个功能的代码吗? - uberchilly
1个回答

1
您可以通过将结果从ViewModelA转发到ViewModelB来实现相同的效果。这将使视图模型分离,不会交织在一起,并提高可测试性。ViewModelA不应知道谁在使用结果。

viewModela.myLiveData.observe(viewLifecycleOwner, viewModelB::onDataRetrieved)

onDataRetrieved中,您将拥有自己的逻辑来调用viewModelB.someLiveData


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接