在我的应用程序中,我有一些数据将在不同片段中的所有应用程序中使用。根据Android官方指南,我们应该使用LiveData和SharedViewModel 该文档仅显示了如何使用片段中的SharedViewModel中的数据。但是... 如何在FragmentViewModel中使用该数据?
用例#1:使用SharedViewModel中的SharedInfo我需要向服务器发出一些请求,并在FragmentViewModel中对服务器的响应进行处理 用例2:我有一些屏幕(片段)同时显示FragmentVM和SharedVM的信息 用例3:当用户单击SomeButton时,我需要将一些数据从SharedViewModel传递到ViewModel
我发现了两种可能的处理方式(也许它们非常相似),但是我似乎可以更清楚地做到这一点。 1)从片段中的SharedViewModel订阅LiveData并在ViewModel中调用某些方法 2)像在RX中一样使用“ CombineLatest”方法(感谢https://github.com/adibfara/Lives)
再现一些示例:
class SharedViewModel(app: Application) : ViewModel(app) {
val sharedInfo = MutableLiveData<InfoModel>()
}
class MyFragmentViewModel(app: Application) : ViewModel(app) {
val otherInfo = MutableLiveData<OtherModel>()
}
class StartFragment : Fragment(){
lateinit var viewModel: MyFragmentViewModel
lateinit var sharedViewModel: SharedViewModel
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
// Create Shared ViewModel in the Activity Scope
activity?.let {
sharedViewModel = ViewModelProviders.of(it).get(SharedViewModel::class.java)
}
// Create simple ViewModel forFragment
viewModel = ViewModelProviders.of(this).get(MyFragmentViewModel::class.java)
// Way #1
sharedViewModel.sharedInfo.observe(this, Observer{
viewModel.toDoSmth(it)
})
viewModel.otherInfo.observe(this, Observer{
sharedViewModel.toDoSmth(it)
})
// Way #2
combineLatest(sharedViewModel.sharedInfo, viewModel.otherInfo){s,o -> Pair(s,o)}.observe(this, Observe{
viewModel.doSmth(it)
// or for example
sharedViewModel.refreshInfo(it)
})
}
}
我希望找到一些清晰的方法来从FragmentVm从SharedVM访问LiveData,反之亦然。也许我认为错了,但这是一个不好的方法,我不应该这样做