Наблюдение за данными с Flow
Реагируйте на изменения базы данных в реактивном стиле
«Наблюдение за данными с Flow» — бесплатный урок Android Academy на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Android Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Android Academy содержит 4 уроков всего.
Реактивное чтение из базы данных
Вместо однократного запроса Room может возвращать поток, который выдаёт новое значение при каждом изменении исходных данных. Ваш пользовательский интерфейс обновляется автоматически.
Возврат потока из DAO
Объявите тип возвращаемого значения как Flow<...>. Обратите внимание: это не suspend-функция.
@Query("SELECT * FROM users ORDER BY name")
fun observeUsers(): Flow<List<User>>Почему здесь не используется suspend
Функция suspend возвращает один результат и завершает работу. Flow — это непрерывный поток, поэтому он представляет собой обычную функцию, возвращающую объект потока; сбор значений выполняется с течением времени.
Как Room понимает, когда выдавать новое значение
Room отслеживает таблицы, которых касается запрос. Когда любая запись изменяет эти таблицы, Room повторно выполняет запрос и передаёт свежий результат в поток. Всё происходит автоматически.
Сбор значений в сопрограмме
Собирайте значения потока внутри сопрограммы, обычно в ViewModel.
viewModelScope.launch {
dao.observeUsers().collect { users ->
_uiState.value = UiState(users)
}
}Преобразование потока
Перед публикацией потока его можно преобразовать с помощью таких операторов, как map.
val names: Flow<List<String>> =
dao.observeUsers().map { list ->
list.map { it.name }
}Преобразование в StateFlow
Преобразуйте холодный поток DAO в горячий StateFlow для пользовательского интерфейса с помощью stateIn.
val uiState = dao.observeUsers()
.map { UiState(it) }
.stateIn(
viewModelScope,
SharingStarted.WhileSubscribed(5000),
UiState()
)Сбор значений в Compose
Экран собирает это состояние с учётом жизненного цикла — именно так, как вы изучили ранее.
@Composable
fun UsersScreen(vm: UserViewModel) {
val state by vm.uiState
.collectAsStateWithLifecycle()
UserList(state.users)
}Полная реактивная цепочка
Объединим всё вместе:
- Room выдаёт новое значение при изменении данных.
- ViewModel преобразует данные в состояние интерфейса с помощью
stateIn. - Compose собирает значения с помощью
collectAsStateWithLifecycle.
Записывайте данные в базу откуда угодно — экран обновится сам.
Единый источник истины
Этот шаблон делает базу данных единым источником истины. Интерфейс никогда не хранит устаревшие копии, а всегда отражает фактически сохранённые данные.
Записи запускают обновления
Любая вставка, обновление или удаление в отслеживаемой таблице повторно выдаёт значение потока, поэтому после изменения не нужно вручную обновлять список.
suspend fun addUser(u: User) = dao.insert(u)
// observeUsers() flow re-emits automaticallyБыстрая проверка
Проверьте своё понимание наблюдения за данными с помощью Flow.
Повторение
Вы научились:
- Методы DAO, возвращающие
Flow, повторно выдают значения при изменении данных. - Это обычные функции (не suspend-функции), возвращающие поток.
- Использовать
stateIn+collectAsStateWithLifecycleдля реактивного управления интерфейсом. - Делать базу данных единым источником истины.
Часто задаваемые вопросы
Урок «Наблюдение за данными с Flow» бесплатный?
Да — полный текст урока «Наблюдение за данными с Flow» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Android Academy, подпишись на CoddyKit PRO. Курс Android Academy содержит 4 уроков всего.
Чему я научусь в уроке «Наблюдение за данными с Flow»?
Реагируйте на изменения базы данных в реактивном стиле Ты практикуешь Android Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Android Academy?
Предыдущий опыт не требуется. Android Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.
Сколько времени занимает урок «Наблюдение за данными с Flow»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Android Academy?
Да. Каждый урок Android Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Сущности и DAO
- Класс базы данных Room
- Запросы и связи
- Наблюдение за данными с Flow