如何从存储库返回 LiveData [英] How to Return LiveData from Repository

查看:25
本文介绍了如何从存储库返回 LiveData的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我只是看不到如何将 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,我认为不需要单独的LiveDataViewModel 中也是如此.您只需要从活动中观察一次 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.

  1. Activity 类:将 makeToast 方法更改为observeCurrentName(),如下所示:

  1. 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屋!

    查看全文
    登录 关闭
    扫码关注1秒登录
    发送“验证码”获取 | 15天全站免登陆