【问题标题】:How to use data from one ViewModel in another ViewModel如何在另一个 ViewModel 中使用来自一个 ViewModel 的数据
【发布时间】:2019-06-01 21:19:23
【问题描述】:

我有一个 AddressesViewModel 保存用户最喜欢的地址,另一个 SearchViewModel 保存搜索到的地址。当用户搜索一个地址时,我必须通过检查收藏夹数组来检查该地址是否是收藏夹。正确的做法是什么?

我已经尝试从 SearchViewModel 订阅 AddressesViewModel,但我正在寻找其他选项,因为它在这些视图模型之间创建了过多的依赖关系。

【问题讨论】:

标签: android viewmodel android-livedata android-mvvm


【解决方案1】:

如果我正确理解了这个问题,另一种选择。 假设你首先有这个:

ViewModelChild(constructor etc) : ViewModelParent(){

    // you can create a var/val to observe a variable in viewmodel parent.
    // upon observation of
    //this you can change other variables assigned here. 

}

【讨论】:

  • 这是一个很棒的解决方案,即使减少视图模型的数量也是一个不错的方面。但请注意,创建此绑定时,所有属性都是共享的(分别与隐私修饰符)。
【解决方案2】:

您必须将两个 ViewModel 附加到同一个生命周期所有者。例如,您有一个名为MainActivity 的活动,两个名为AddressesViewModelSearchViewModel 的ViewModel,您需要为SearchViewModelAddressesViewModel 获取一个名为address 的变量

class MyActivity: AppCompactAvtivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        .
        .
        // Attach the ViewModels
        val addressViewModel = ViewModelProviders.of(this).get(AddressesViewModel::class.java)
        val searchViewModel = ViewModelProviders.of(this).get(SearchViewModel::class.java)

        // Listen to address which is in SearchViewModel
        searchViewModel.address.observe(this, Observer { address ->
            // Send the variable to AddressesViewModel using a public method
            val favOrNot addressViewModel.isAddressFavourite(address)
            // or 
            addressViewModel.favouriteAddress = address
        })
    }
}

希望这能回答你的问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-11-25
    • 1970-01-01
    • 1970-01-01
    • 2021-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多