ViewModel возвращает чистый объект, когда я пытаюсь получить от него данные

#android #kotlin #viewmodel

#Android #kotlin #viewmodel

Вопрос:

Я пытаюсь использовать ViewModel , для сохранения данных для совместного Fragments использования. Вот и все:

 class AnimalViewModel : ViewModel() {
    private var data = MutableLiveData<AnimalWithHints>()

    fun setData(animalData: AnimalWithHints) {
        data.value = animalData
        Timber.e("Saved?")
    }

    fun getData(): LiveData<AnimalWithHints> {
        if (data.value == null) {
            Timber.e("Null?")
            data.value = AnimalWithHints()
        }
        return data
    }
}
  

Итак, я заполнил ненулевой объект (проверил его) и пишу перед транзакцией:

 ViewModelProviders.of(this).get(AnimalViewModel::class.java).setData(animalWithHints)
  

Я вижу «Сохранено?»когда это происходит, я думаю, что save работает хорошо. Я зарегистрировал некоторое поле AnimalWithHints , и я увидел, что оно правильное.

Затем я пытаюсь получить свой объект:

 val animalWithHints = ViewModelProviders.of(this).get(AnimalViewModel::class.java).getData().value
  

И я вижу «Null?». И это правда, data.value это просто новый пустой AnimalWithHints объект.

Странно, что у меня есть только две строки кода, используя ViewModel . Я только сохраняю и получаю объект, нет места, когда я могу его очистить или как-то изменить.

Мне нужна ваша помощь, чтобы понять, что не так.

Комментарии:

1. Если вы хотите передавать данные между фрагментами, которые находятся в одном и том же действии, вам нужно будет создать ViewModel экземпляр, передав getActivity() ему как Activity контекст, а не как Fragment контекст..

2. Да, это работает. Блестяще. Вы можете сформировать его для ответа.

Ответ №1:

Если вы хотите обмениваться данными между вашими Fragments , которые находятся в одном и том же Activity , вам нужно будет создать экземпляр ViewModel с контекстом Activity .

Приведенный ниже синтаксис предоставляет вам экземпляр ViewModel , который находится Fragment только на уровне (вы можете поделиться им с самим фрагментом с некоторыми дочерними фрагментами внутри этого фрагмента):

 ViewModelProviders.of(this@Fragment)[SomeViewModel::class.java] // This will give you view model at fragment level
  

При передаче Activity объекта вашему ViewModelProvider внутреннему вашему Fragment дает вам ViewModel Activity уровень. Следовательно, у вас есть несколько фрагментов внутри одного и того же Activity значения, контекст действия одинаковый, дает один и тот же ViewModel объект в обоих Fragments .

Итак, для обмена ViewModel между фрагментами используйте приведенный ниже синтаксис :

 ViewModelProviders.of(activity)[SomeViewModel::class.java] // This will provide you shared view model across multiple fragments.