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 поддерживает следующие примитивные типы ключей:
stringPreferencesKeybooleanPreferencesKeyintPreferencesKey,longPreferencesKey,floatPreferencesKey,doublePreferencesKeystringSetPreferencesKey
Определяйте ключи в одном месте
Обычно все ключи объединяют в 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 — локальная установка не требуется.
Все уроки этого курса
- DataStore и SharedPreferences
- DataStore для настроек
- Чтение и запись настроек
- Proto DataStore