Лучший способ передачи данных из хранилища во фрагмент с двухсторонними полями привязки данных? - PullRequest
0 голосов
/ 21 октября 2019

У меня есть фрагмент, который получает 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 {}) }
...