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