首页 > 解决方案 > LiveData 在用户执行某些操作之前无法工作

问题描述

LiveData的不工作。

ViewModel

 private var _email = MutableLiveData<String>()

 fun setEmail(){
    _email.postValue("azizjon@bla.mn")
 }

 fun getEmail(): LiveData<String>{
     return _email
 }

FragmentonViewCreated方法:

 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 有效,但对Fragments 无效。

标签: androidandroid-livedataandroid-viewmodel

解决方案


@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
    }
}

推荐阅读