Функция remember
Функция remember вычисляет значение
один раз и сохраняет его, пока composable
остаётся в дереве с тем же ключом.
При следующей перерисовке лямбда
не вызывается снова, если ключи не сменились.
Часто внутри создают
mutableStateOf
или тяжёлый объект.
Синтаксис
val value = remember { mutableStateOf("abcde") }
Параметры
| Параметр | Описание |
|---|---|
keys |
Необязательные ключи. Если любой ключ сменился, значение пересчитают заново. |
calculation |
Лямбда, которая создаёт запоминаемое значение. |
Пример
Давайте запомним счётчик нажатий:
import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.compose.material3.Button
import androidx.compose.material3.Text
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableIntStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContent {
var count by remember { mutableIntStateOf(0) }
Button(onClick = { count++ }) {
Text(text = "abcde")
}
Text(text = if (count == 0) "abcde" else "12345")
}
}
}
На экране текст сменится на "12345"
после первого нажатия и останется при перерисовке.
Пример
Давайте сбросим счётчик при смене ключа:
import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.compose.material3.Button
import androidx.compose.material3.Text
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableIntStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContent {
var key by remember { mutableIntStateOf(0) }
var count by remember(key) { mutableIntStateOf(0) }
Button(onClick = { count++ }) {
Text(text = "abcde")
}
Button(onClick = { key++ }) {
Text(text = "12345")
}
Text(text = if (count == 0) "abcde" else "12345")
}
}
}
На экране вторая кнопка обнулит счётчик, потому что remember пересчитает значение.
Смотрите также
-
функция
mutableStateOf,
которой создают изменяемое состояние -
функция
rememberSaveable,
которая переживает поворот экрана -
функция
derivedStateOf,
которая считает производное значение -
класс
MutableState,
который возвращает mutableStateOf