我只是看不到如何将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() }ViewModel
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..
推荐答案实际上,如果您在存储库中维护LiveData,我认为在ViewModel中也不需要单独的LiveData.您只需从活动中观察一次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.
活动类:将makeToast方法更改为observeCurrentName(),如下所示:
Activity class: Change makeToast method to observeCurrentName() like this: private fun observeCurrentName() { vm.getCurrentName().observe(this, Observer{ //Toast here }) }
您的VM:
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
发布评论