【问题标题】:LiveData not working until user performs some actionLiveData 在用户执行某些操作之前无法工作
【发布时间】:2020-02-26 12:06:14
【问题描述】:

我的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 测试了代码。令人惊讶的是,对于Activitys,它可以正常工作,但对于Fragments 无效。

【问题讨论】:

  • 你在哪里放置 mViewModel.setEmail() 在应用程序中。这段代码是写在 oncreate() 函数里面的吗?
  • @DivakarMurugesh 在FragmentonViewCreated方法里面
  • 你在哪里初始化视图模型变量?
  • @DivakarMurugesh 在父 Fragment 类'onViewCreated 方法中。

标签: android android-livedata android-viewmodel


【解决方案1】:

@Azizjon Kholmatov - 您可以在 "onActivityCreated" 函数中编写代码的最佳实践

请参考这个。如果您仍然遇到问题,请在 cmets 部分告诉我。我很乐意提供帮助。 :)

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

【讨论】:

  • 感谢您的宝贵时间。看起来我的代码中还有另一个问题。我正在尝试进行更多调查。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-27
  • 1970-01-01
  • 2017-08-08
  • 1970-01-01
  • 1970-01-01
  • 2013-01-17
相关资源
最近更新 更多