Ответ
Функция remember сохраняет состояние в памяти композейбл-функции на протяжении её жизненного цикла. Значение сохраняется до тех пор, пока композейбл остается в составе Composition. При рекомпозиции значение будет восстановлено, а при выходе из Composition — удалено.
Пример:
@Composable
fun Counter() {
var count by remember { mutableStateOf(0) }
Button(onClick = { count++ }) {
Text("Clicked $count times")
}
}
Важно: remember не сохраняет состояние при изменении конфигурации (например, повороте экрана). Для этого нужно использовать rememberSaveable.
Ответ 18+ 🔞
Ну слушай, история про этот remember — это вообще отдельная песня, ёпта. Представь себе: ты пишешь композейбл, и тебе нужно где-то хранить цифру, флаг, какой-то кусок состояния. И вот ты такой: "Так, щас я объявлю тут var count = 0..." И тут же охуеешь на первой же рекомпозиции, потому что эта переменная обнулится, будто её и не было. Пиздец, да? Каждый раз заново.
Вот для этого и придумали remember. Это как хитрая жопа, которая прячет твоё значение в карман композиции и говорит: "Не, мужик, я тебя запомнил". Пока твой композейбл висит в дереве, живёт и дышит — значение на месте. Сделал рекомпозицию? remember тебе это значение обратно вытащит, не переживай. Всё, казалось бы, заебись.
Но тут, бля, есть один подводный камень, про который все вначале обжигаются. Вот смотри на примере, тут всё понятно:
@Composable
fun Counter() {
var count by remember { mutableStateOf(0) }
Button(onClick = { count++ }) {
Text("Clicked $count times")
}
}
Нажимаешь на кнопку — count растёт. Перерисовывается интерфейс — значение на месте. Всё работает, удивление пиздец, как просто.
А теперь представь, что ты вертел телефон и экран перевернулся. Или свернул приложение, а потом развернул. И тут наступает момент истины, и remember накрывается медным тазом. Всё, привет. Состояние слетает в ноль, будто его и не было. Почему? Да потому что remember — это память только на время жизни композиции. А смена конфигурации — это пиздец, извините, полный. Старое дерево композиции выпиливается, и всё, что было в remember, летит в чёрную дыру.
И вот тут в игру вступает его старший братан — rememberSaveable. Этот чувак уже не просто запоминает, он умеет сохранять состояние в Bundle, как это делают активити. Повернул экран — состояние на месте. Свернул-развернул — тоже, скорее всего, выживет. Это уже серьёзнее.
Так что правило простое, бля:
remember— когда тебе нужно пережить рекомпозицию внутри одной сессии. Типа счётчика в рамках одного экрана.rememberSaveable— когда нужно пережить ещё и пиздец конфигурации или смерть процесса. Типа введённого текста в поле, который не должен пропадать, когда пользователь экран крутанёт.
Вот и вся магия. Не перепутай, а то будет тебе хиросима, когда после поворота все твои труды обнулятся. Сам от этого охуевал не раз.