#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.