0Pricing
Android Academy · Урок

DataStore для настроек

Реактивно храните настройки в формате «ключ — значение»

«DataStore для настроек» — бесплатный урок Android Academy на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Android Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Android Academy содержит 4 уроков всего.

Preferences DataStore

Preferences DataStore хранит простые пары «ключ—значение», подобно SharedPreferences, но использует современный асинхронный API. Для всего объекта не задаются схема и строгая типизация.

Доступ к значениям осуществляется через типизированные ключи.

Создание DataStore

Создайте один экземпляр DataStore для каждого файла с помощью делегата свойства preferencesDataStore на верхнем уровне файла Kotlin. Значение name становится именем файла на диске.

import androidx.datastore.preferences.preferencesDataStore
import androidx.datastore.preferences.core.Preferences

val Context.dataStore: DataStore<Preferences> by
    preferencesDataStore(name = "settings")

Зачем нужен делегат верхнего уровня

Делегат гарантирует, что в Вашем процессе существует ровно один экземпляр DataStore для этого имени файла. Создание двух экземпляров для одного файла вызывает ошибку, поскольку они будут конфликтовать из-за одних и тех же данных.

Объявление делегата как расширения Context верхнего уровня сохраняет его единственным экземпляром.

Ключи настроек

Для каждого значения нужен типизированный ключ. Ключ одновременно задаёт имя записи и фиксирует её тип. Вспомогательные функции создают ключи для каждого поддерживаемого типа.

import androidx.datastore.preferences.core.stringPreferencesKey
import androidx.datastore.preferences.core.booleanPreferencesKey
import androidx.datastore.preferences.core.intPreferencesKey

val USERNAME = stringPreferencesKey("username")
val DARK_MODE = booleanPreferencesKey("dark_mode")
val LAUNCH_COUNT = intPreferencesKey("launch_count")

Поддерживаемые типы ключей

Preferences DataStore поддерживает следующие примитивные типы ключей:

  • stringPreferencesKey
  • booleanPreferencesKey
  • intPreferencesKey, longPreferencesKey, floatPreferencesKey, doublePreferencesKey
  • stringSetPreferencesKey

Определяйте ключи в одном месте

Обычно все ключи объединяют в object, чтобы их было легко находить и повторно использовать, избегая опечаток в строковых именах.

object PrefKeys {
    val USERNAME = stringPreferencesKey("username")
    val DARK_MODE = booleanPreferencesKey("dark_mode")
    val FONT_SIZE = intPreferencesKey("font_size")
}

Строковые ключи и имена переменных

Помните, что строковый аргумент (например, "dark_mode") записывается на диск. Если позже переименовать его, старые значения станут недоступны. Имя Kotlin val используется только в Вашем коде.

Отдельный DataStore для каждой задачи

Вы можете создать несколько экземпляров DataStore для разных задач, указав для каждого собственное имя файла, например хранилище «settings» и хранилище «user_session». Храните связанные ключи вместе.

val Context.settingsStore by preferencesDataStore(name = "settings")
val Context.sessionStore by preferencesDataStore(name = "session")

Доступ из слоя интерфейса

Хотя делегат связан с Context, не считывайте данные напрямую в компонентах Compose. Передайте DataStore в репозиторий, а затем предоставьте потоки во ViewModel. Это сохраняет возможность тестировать интерфейс.

Простая структура репозитория

Обёртка над DataStore в виде класса репозитория предоставляет понятный API и единое место для определения ключей и логики преобразования.

class SettingsRepository(private val dataStore: DataStore<Preferences>) {
    val darkMode: Flow<Boolean> = dataStore.data
        .map { it[PrefKeys.DARK_MODE] ?: false }
}

Значения по умолчанию

Ключ может ещё не существовать, поэтому при чтении возвращается null. Всегда задавайте значение по умолчанию с помощью оператора Элвиса ?: при преобразовании значения настройки.

val fontSize: Flow<Int> = dataStore.data
    .map { prefs -> prefs[PrefKeys.FONT_SIZE] ?: 14 }

Быстрая проверка

Проверьте, насколько хорошо Вы понимаете принцип работы ключей настроек.

Итоги

Вы настроили Preferences DataStore:

  • Создали один экземпляр с помощью делегата верхнего уровня preferencesDataStore
  • Определили типизированные ключи с помощью stringPreferencesKey, booleanPreferencesKey и других функций
  • Объединили ключи в object и обернули доступ к ним в репозиторий
  • Всегда задавали значения по умолчанию для отсутствующих ключей

Далее Вы научитесь непосредственно читать и записывать эти настройки.

Часто задаваемые вопросы

Урок «DataStore для настроек» бесплатный?

Да — полный текст урока «DataStore для настроек» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Android Academy, подпишись на CoddyKit PRO. Курс Android Academy содержит 4 уроков всего.

Чему я научусь в уроке «DataStore для настроек»?

Реактивно храните настройки в формате «ключ — значение» Ты практикуешь Android Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Android Academy?

Предыдущий опыт не требуется. Android Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.

Сколько времени занимает урок «DataStore для настроек»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Android Academy?

Да. Каждый урок Android Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

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

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