根据CleanArchitecture原理进行交互的ViewModel和SharedViewModel

时间:2019-07-29 16:31:27

标签: android kotlin android-architecture-components android-viewmodel

在我的应用程序中,我有一些数据将在不同片段中的所有应用程序中使用。根据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,反之亦然。也许我认为错了,但这是一个不好的方法,我不应该这样做

0 个答案:

没有答案