rememberSaveable
Сохраняйте состояние при изменениях конфигурации
«rememberSaveable» — бесплатный урок Android Academy на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Android Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Android Academy содержит 4 уроков всего.
Проблема с remember
remember переживает рекомпозицию, но не изменения конфигурации, например поворот экрана. При пересоздании действия сохранённое состояние теряется и возвращается к исходному значению.
Знакомьтесь: rememberSaveable
rememberSaveable работает как remember, но также сохраняет значение при изменениях конфигурации и завершении процесса, а затем восстанавливает его.
var count by rememberSaveable { mutableStateOf(0) }Пример с поворотом экрана
При обычном remember поворот телефона сбрасывает счётчик до 0. С rememberSaveable значение счётчика сохраняется после поворота.
Как это сохраняется
Внутри rememberSaveable сохраняет значение в Bundle сохранённого состояния экземпляра действия — это тот же механизм, который старая система View использовала для onSaveInstanceState.
Поддерживаемые типы
Средство автоматически сохраняет типы, которые помещаются в Bundle: примитивы, String и объекты Parcelable. Для пользовательских типов потребуется немного дополнительной работы.
Завершение процесса
Если Android завершит работу приложения в фоновом режиме, чтобы освободить память, а затем пользователь вернётся в приложение, rememberSaveable восстановит сохранённое состояние, и экран будет выглядеть так, как пользователь его оставил.
Пользовательские средства сохранения
Для типа, который нельзя сохранить автоматически, предоставьте средство сохранения, преобразующее его в сохраняемую форму и обратно. Compose предлагает такие вспомогательные средства, как listSaver и mapSaver.
val saver = listSaver<MyState, Any>(
save = { listOf(it.a, it.b) },
restore = { MyState(it[0] as Int, it[1] as String) }
)Использование пользовательского средства сохранения
Передайте средство сохранения в rememberSaveable через его параметр saver, чтобы Compose знал, как сохранять Ваш тип.
var state by rememberSaveable(stateSaver = saver) {
mutableStateOf(MyState(0, ""))
}Когда что использовать
Используйте rememberSaveable для состояния, потеря которого при повороте раздражала бы пользователя: ввода в форме, позиции прокрутки, выбранной вкладки. Используйте обычный remember для временного состояния интерфейса, которое можно без проблем сбросить.
Не для больших данных
Сохранённый Bundle имеет небольшой размер. Не храните большие данные (растровые изображения, длинные списки) в rememberSaveable. Храните объёмные данные в ViewModel или репозитории, а сохраняйте только небольшие идентификаторы.
Собираем всё вместе
Поле формы, которое сохраняет значение после поворота экрана благодаря rememberSaveable.
@Composable
fun LoginField() {
var email by rememberSaveable { mutableStateOf("") }
TextField(
value = email,
onValueChange = { email = it }
)
}Быстрая проверка
Что делает rememberSaveable, чего не делает remember?
Итоги
rememberSaveable:
- Сохраняет состояние после поворота экрана и завершения процесса, а не только при рекомпозиции.
- Автоматически сохраняет примитивы,
StringиParcelable. - Для пользовательских типов используйте средство сохранения.
- Храните небольшой объём сохраняемых данных; большие объёмы данных следует хранить в ViewModel.
Часто задаваемые вопросы
Урок «rememberSaveable» бесплатный?
Да — полный текст урока «rememberSaveable» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Android Academy, подпишись на CoddyKit PRO. Курс Android Academy содержит 4 уроков всего.
Чему я научусь в уроке «rememberSaveable»?
Сохраняйте состояние при изменениях конфигурации Ты практикуешь Android Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Android Academy?
Предыдущий опыт не требуется. Android Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.
Сколько времени занимает урок «rememberSaveable»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Android Academy?
Да. Каждый урок Android Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.