LiveData не работает, пока пользователь не выполнит какое-либо действие - PullRequest
0 голосов
/ 26 февраля 2020

Мой 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 с он работает, но не для Fragment с.

1 Ответ

1 голос
/ 26 февраля 2020

@ Азизжон Холматов - Наилучшая практика, вы можете написать свой код внутри "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
    }
}
...