Двусторонняя привязка данных Android с использованием MutableStateFlow и наблюдение за изменениями в ViewModel
Только что узнал, пытаясь заменить
MutableLiveData
. Также Android не рекомендует соблюдать
LiveData
внутри
ViewModel
(если вы не используете
observeForever(observer)
но вам нужно не забыть удалить его, так что это хлопотно).
data class Student(var id: Long, var name: String, var countryIndex: Int)
class FirstViewModel(application: Application) : AndroidViewModel(application) {
val uiScope = viewModelScope //Main Dispatcher
val countries = listOf("China", "America", "Japan", "Korea")
val student = Student(0, "Kate", 2) //faking database object
val country = MutableStateFlow(countries[student.countryIndex]) //two-way bind with AutoCompleteTextView "text" attribute
init {
observeCountry()
}
private fun observeCountry() = uiScope.launch { //<- should move to other Dispatcher??
country.collect { country ->
countries.indexOf(country).let { student.countryIndex = it } //country name -> country index -> update Student object
}
}
}
Приведенный выше код работает отлично, но я хочу убедиться, что использую ли я
MutableStateFlow
правильно в этом примере. Мне нужно переключиться на
Dispatchers.Default
для
collect{}
?
1 ответ
Официальная документация указывает, что это должно выглядеть так:
private val _country = MutableStateFlow<List<String>>("")
val country: StateFlow<List<String>> = _country
куда
_country
вы используете для значения обновления и
country
обращаться для чтения к остальным приложениям (потребителям)
Проблема в том, что вы не могли использовать
StateFlow<>
тип для двухсторонней привязки, только для чтения. По крайней мере, я еще не нашел способ управлять им и держать
MutableStateFlow<>
инкапсулированный.
Просто замечание к вашему коду.