如何从存储库返回 LiveData [英] How to Return LiveData from Repository
问题描述
我只是看不到如何将 LiveData 从 Repo 链接到 VM,所以我尝试将其归结为最简单的示例!:
I just can't see how to chain LiveData from Repo to VM, so I have tried to boil this down to the most simple of example!:
片段
class LoginFragment : Fragment() {
private lateinit var loginViewModel: LoginViewModel
private var mCurrentName = "Blank!"
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?): View? {
// Inflate the layout for this fragment
val binding: LoginFragmentBinding = DataBindingUtil.inflate(
inflater, R.layout.login_fragment, container, false)
binding.apply {
loginButton.setOnClickListener{
loginViewModel.changeText()
}
}
return binding.root
}
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
loginViewModel = ViewModelProviders.of(this).get(LoginViewModel::class.java)
loginViewModel.getCurrentName().observe(viewLifecycleOwner, Observer {
mCurrentName = it // I'm expecting mCurrentName to equal "Button Clicked!" when button clicked..
makeToast() // Toast works, but variable remains unchanged..
})
}
private fun makeToast() {
Toast.makeText(activity, mCurrentName, Toast.LENGTH_LONG).show()
}
视图模型
class LoginViewModel : ViewModel() {
private val firestoreRepository : FirestoreRepository = FirestoreRepository()
private var mCurrentName = MutableLiveData<String>()
fun changeText(){
mCurrentName = firestoreRepository.changeText()
}
存储库
class FirestoreRepository {
private val mCurrentName = MutableLiveData<String>()
fun changeText(): MutableLiveData<String> {
mCurrentName.value = "Button Clicked!!"
return mCurrentName
}
我假设我误解了观察者函数的工作原理..
I'm assuming I have misunderstood how the observer function works..
推荐答案
其实如果你在repository中维护LiveData
,我认为不需要单独的LiveData
在 ViewModel
中也是如此.您只需要从活动中观察一次 LiveData.然后直接对存储库实例进行任何更改.所以如果我必须在你的代码中展示它,它可能看起来像这样.
Actually If you are maintaining LiveData
in repository, I don't think there's a need of separate LiveData
in ViewModel
as well. You just have to observe the LiveData once from the activity. Then make any changes to repository instance directly. So If I have to show it in your code, It might look something like this.
Activity 类:将 makeToast 方法更改为observeCurrentName(),如下所示:
Activity class: Change makeToast method to observeCurrentName() like this:
private fun observeCurrentName() {
vm.getCurrentName().observe(this, Observer{
//Toast here
})
}
你的虚拟机:
Your VM:
class LoginViewModel : ViewModel() {
...
fun getCurrentName(): MutableLiveData<String>{
return repository.getCurrentName()
}
fun setCurrentName(name: String?){
repository.setCurrentName(name)
}
...
}
您的存储库:
Your repository:
class FirestoreRepository {
private val mCurrentName = MutableLiveData<String>()
fun getCurrentName(): MutableLiveData<String>{
return mCurrentName
}
fun setCurrentName(name: String?){
mCurrentName.value = name //This will trigger observer in Activity
}
}
这篇关于如何从存储库返回 LiveData的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!