Чтение и запись настроек
Сохраняйте настройки пользователя и наблюдайте за ними
«Чтение и запись настроек» — бесплатный урок Android Academy на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Android Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Android Academy содержит 4 уроков всего.
Чтение и запись
После определения ключей остаются две основные операции: чтение потока данных и запись с помощью edit. Чтение выполняется реактивно, а запись — приостанавливаемыми функциями.
Поток данных
dataStore.data — это Flow<Preferences>. При каждой записи поток выдаёт новый снимок Preferences, поэтому получатели автоматически получают актуальные данные.
val rawData: Flow<Preferences> = dataStore.dataПреобразование одного значения
Обычно Вам не нужен весь объект Preferences. Используйте map, чтобы извлечь один ключ и применить значение по умолчанию.
val darkMode: Flow<Boolean> = dataStore.data
.map { prefs -> prefs[PrefKeys.DARK_MODE] ?: false }Обработка ошибок чтения
При чтении с диска может возникнуть ошибка IOException. Используйте catch перед map, чтобы выдать пустые настройки и сохранить работоспособность потока.
val darkMode: Flow<Boolean> = dataStore.data
.catch { e ->
if (e is IOException) emit(emptyPreferences())
else throw e
}
.map { it[PrefKeys.DARK_MODE] ?: false }Запись с помощью edit
Чтобы изменить значения, вызовите приостанавливаемую функцию edit. Внутри лямбды Вы получите изменяемый объект настроек и зададите в нём ключи. Весь блок представляет собой одну транзакцию.
suspend fun setDarkMode(enabled: Boolean) {
dataStore.edit { prefs ->
prefs[PrefKeys.DARK_MODE] = enabled
}
}edit — приостанавливаемая функция
Поскольку edit приостанавливает выполнение, её необходимо вызывать из корутины, обычно внутри ViewModel с помощью viewModelScope.launch. Это гарантирует, что запись выполняется не в главном потоке.
fun toggleDarkMode(value: Boolean) {
viewModelScope.launch {
repository.setDarkMode(value)
}
}Обновление нескольких ключей
В одном блоке edit можно задать несколько ключей. Они фиксируются атомарно вместе, поэтому наблюдатели никогда не увидят частично выполненное обновление.
dataStore.edit { prefs ->
prefs[PrefKeys.USERNAME] = "ada"
prefs[PrefKeys.DARK_MODE] = true
prefs[PrefKeys.FONT_SIZE] = 16
}Увеличение значения
Внутри edit можно прочитать текущее значение и вычислить новое. Это удобно для счётчиков, например для подсчёта запусков.
suspend fun incrementLaunchCount() {
dataStore.edit { prefs ->
val current = prefs[PrefKeys.LAUNCH_COUNT] ?: 0
prefs[PrefKeys.LAUNCH_COUNT] = current + 1
}
}Удаление и очистка
Удалите один ключ с помощью remove или очистите всё хранилище с помощью clear — обе операции выполняются внутри блока edit.
dataStore.edit { prefs ->
prefs.remove(PrefKeys.USERNAME)
}
dataStore.edit { prefs ->
prefs.clear()
}Сбор данных в Compose
В компоненте Compose преобразуйте поток ViewModel в состояние с помощью collectAsStateWithLifecycle(). Интерфейс повторно компонуется при каждом изменении настройки.
val darkMode by viewModel.darkMode.collectAsStateWithLifecycle(initial = false)
Switch(
checked = darkMode,
onCheckedChange = { viewModel.toggleDarkMode(it) }
)Цикл чтения, изменения и записи
Общий процесс выглядит так: интерфейс читает данные через поток, пользователь переключает настройку, ViewModel запускает корутину, которая вызывает edit, DataStore записывает данные, поток выдаёт их снова, а интерфейс повторно компонуется. Реактивность сохраняется на всём пути.
Быстрая проверка
Проверьте, насколько хорошо Вы понимаете чтение и запись данных.
Итоги
Теперь Вы умеете читать и записывать настройки:
dataStore.data— это реактивныйFlow<Preferences>mapизвлекает одно значение, аcatchобрабатывает ошибки ввода-выводаdataStore.edit { }атомарно записывает данные из корутиныcollectAsStateWithLifecycleуправляет интерфейсом Compose
Далее: типизированные структурированные данные с Proto DataStore.
Часто задаваемые вопросы
Урок «Чтение и запись настроек» бесплатный?
Да — полный текст урока «Чтение и запись настроек» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Android Academy, подпишись на CoddyKit PRO. Курс Android Academy содержит 4 уроков всего.
Чему я научусь в уроке «Чтение и запись настроек»?
Сохраняйте настройки пользователя и наблюдайте за ними Ты практикуешь Android Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Android Academy?
Предыдущий опыт не требуется. Android Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.
Сколько времени занимает урок «Чтение и запись настроек»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Android Academy?
Да. Каждый урок Android Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- DataStore и SharedPreferences
- DataStore для настроек
- Чтение и запись настроек
- Proto DataStore