У меня есть фрагмент, который получает user id
от другого фрагмента через safe args
. А также у меня есть хранилище с функцией возврата LiveData<User>
на id
. Этот фрагмент содержит multiple text fields
, который подключен к viewModel
с помощью two-way data binding
.
Каков наилучший способ передачи данных из хранилища в поля фрагментов?
Iзнаю два способа, как это сделать, но я не думаю, что они лучшие (оба используют LiveData transformations
).
1)
AddEditUserViewModel
val fName = MutableLiveData<String>() // Two-way data-binding, exposing MutableLiveData
...
private val userId = MutableLiveData<String>()
val userData: LiveData<User> = Transformations.switchMap(userId) { id ->
userRepo.getUserById(id)
}
/**
* Called after subscription to the userData
*/
fun loadData(id: String) {
userId.value = id
}
AddEditUserFragment
viewModel.userData.observe(this, Observer {
viewModel.fName.value = it?.fName
...
})
args.userId?.let { viewModel.loadData(it) }
2)
Второй способ имеет blank observer
, что не хорошо.
AddEditUserViewModel
fun loadData(id : String) : LiveData<User> {
val liveData = MediatorLiveData<User>()
liveData.addSource(userRepo.getUserById(id)) {
it?.let {
fName.value = it.fName
...
}
}
return liveData
}
AddEditUserFragment
args.userId?.let { viewModel.loadData(it).observe(this, Observer {}) }