Функция derivedStateOf
Функция derivedStateOf создаёт
State,
значение которого считают из других состояний.
Перерисовка случится только если
результат лямбды реально изменился,
а не при каждом чихе исходных данных.
Вызов оборачивают в
remember.
Синтаксис
val label by remember {
derivedStateOf { if (count > 0) "12345" else "abcde" }
}
Параметры
| Параметр | Описание |
|---|---|
calculation |
Лямбда без аргументов. Внутри читают другие State и возвращают итоговое значение. |
Пример
Давайте выведем подпись только когда счётчик больше нуля:
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.derivedStateOf
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) }
val label by remember {
derivedStateOf {
if (count > 0) "12345" else "abcde"
}
}
Button(onClick = { count++ }) {
Text(text = "abcde")
}
Text(text = label)
}
}
}
На экране текст сменится на "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.derivedStateOf
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) }
val parity by remember {
derivedStateOf {
if (count % 2 == 0) "abcde" else "12345"
}
}
Button(onClick = { count++ }) {
Text(text = "abcde")
}
Text(text = parity)
}
}
}
На экране строка будет чередовать
"abcde" и "12345" при каждом нажатии.
Смотрите также
-
функция
mutableStateOf,
от которой зависит derivedStateOf -
функция
remember,
где держат derivedStateOf -
класс
State,
который возвращает производное значение -
функция
produceState,
которая асинхронно обновляет State