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

Я пытаюсь использовать 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)

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

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

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

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

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

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

1 Ответ

1 голос
/ 13 апреля 2019

Если вы хотите обмениваться данными между 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.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...