android - LiveData 在用户执行某些操作之前无法工作
问题描述
我LiveData
的不工作。
ViewModel
:
private var _email = MutableLiveData<String>()
fun setEmail(){
_email.postValue("azizjon@bla.mn")
}
fun getEmail(): LiveData<String>{
return _email
}
Fragment
的onViewCreated
方法:
mViewModel.getEmail().observe(viewLifecycleOwner, Observer {
tvEmail.text = it
})
mViewModel.setEmail() //Trying to post data to my LiveData.
上面的代码不起作用,因为tvEmail
没有改变。
但是,如果我信任这样一个将数据发布到 LiveData 的按钮,它就可以工作:
//Inside fragment again
button.setOnClickListener {
mViewModel.setEmail()
}
当用户单击按钮时,文本tvEmail
正在更改。如果用户不点击,什么都不会发生。我在这里想念什么?
编辑:
我刚刚用Activity
. 令人惊讶的是,Activity
它对 s 有效,但对Fragment
s 无效。
解决方案
@Azizjon Kholmatov - 您可以在“onActivityCreated”函数中编写代码的最佳实践
请参考这个。如果您仍然遇到问题,请在评论部分告诉我。我很乐意提供帮助。:)
class MainFragment : Fragment() {
companion object {
fun newInstance() = MainFragment()
}
private lateinit var viewModel: MainViewModel
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View {
return inflater.inflate(R.layout.main_fragment, container, false)
}
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
viewModel = ViewModelProviders.of(this).get(MainViewModel::class.java)
viewModel.getEmail().observe(viewLifecycleOwner, Observer {
tvEmail.text = it
})
viewModel.setEmail("first@email.com")
button.setOnClickListener {
viewModel.setEmail("clicked@email.com")
}
}
}
和 ViewModel 类如下
class MainViewModel : ViewModel() {
private var _email = MutableLiveData<String>()
fun setEmail(email: String = "example@email.com") {
_email.postValue(email)
}
fun getEmail(): LiveData<String> {
return _email
}
}