Двусторонняя привязка данных 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<>инкапсулированный.

Просто замечание к вашему коду.

Другие вопросы по тегам