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

1

Я пытаюсь использовать 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. Я только сохраняю и получаю объект, нет места, когда я могу его очистить или изменить каким-либо образом.

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

Теги:
kotlin
viewmodel

1 ответ

0

Если вы хотите обмениваться данными между вашими 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.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню