0Pricing
Android Academy · Урок

Чтение и запись настроек

Сохраняйте настройки пользователя и наблюдайте за ними

«Чтение и запись настроек» — бесплатный урок 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 — локальная установка не требуется.

Все уроки этого курса

  1. DataStore и SharedPreferences
  2. DataStore для настроек
  3. Чтение и запись настроек
  4. Proto DataStore
← Назад к Android Academy