Где сохраняется состояние в Jetpack Compose
Что проверяют
Понимаете ли вы разницу между тремя уровнями сохранения: пересоздание композиции, изменение конфигурации и смерть процесса. Ответ «в remember» неполный.
Как отвечать
Разложите по уровням, от короткого к длинному:
rememberдержит значение между перекомпозициями. Экран перерисовался, значение осталось. Но при повороте экрана композиция создаётся заново, и значение теряется;rememberSaveableпереживает изменение конфигурации и восстановление процесса из состояния «убит в фоне», потому что кладёт значение в тот же механизм, что и старыйonSaveInstanceState. Подходит для простых значений: текст поля, выбранная вкладка, флаг раскрытия. Для своих типов нуженSaver;ViewModelпереживает изменение конфигурации и хранит состояние экрана целиком вместе с логикой его получения. Это правильное место для загруженных данных и текущего состояния загрузки;SavedStateHandleвнутри ViewModel переживает смерть процесса, туда кладут идентификаторы и ключевые параметры экрана;- слой данных (база, хранилище настроек) для всего, что должно жить между запусками.
Обязательно скажите про подъём состояния: состояние держат выше того компонента, который его показывает, а сам компонент делают безсостояточным и управляемым через параметры. Так его проще переиспользовать и тестировать.
var query by rememberSaveable { mutableStateOf("") }
SearchField(value = query, onValueChange = { query = it })Где спотыкаются
Держат состояние экрана в remember и теряют его при повороте.
Кладут в rememberSaveable крупные объекты: механизм рассчитан на небольшие значения, и большие данные упираются в ограничение размера транзакции.
Забывают ключи у remember: без них значение не пересчитается при смене входных данных.