Функция produceState
Функция produceState возвращает
State
с начальным значением и запускает
корутину в scope composable.
Внутри suspend-лямды пишут в свойство
value, и экран перерисовывается.
Ключи как у
LaunchedEffect:
при их смене корутина перезапускается.
Синтаксис
val text by produceState(initialValue = "abcde", key1) {
value = loadText()
}
Параметры
| Параметр | Описание |
|---|---|
initialValue |
Значение до первого обновления из корутины. |
keys |
Ключи перезапуска producer-корутины. |
producer |
Suspend-лямда ProduceStateScope.
Меняет value для обновления State.
|
Пример
Давайте подменим текст после задержки:
import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.compose.material3.Text
import androidx.compose.runtime.produceState
import kotlinx.coroutines.delay
class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContent {
val text by produceState(initialValue = "abcde") {
delay(1000)
value = "12345"
}
Text(text = text)
}
}
}
На экране секунду будет "abcde",
затем текст сменится на "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.produceState
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import kotlinx.coroutines.delay
class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContent {
var key by remember { mutableIntStateOf(0) }
val text by produceState(
initialValue = "abcde",
key,
) {
delay(300)
value = if (key == 0) "abcde" else "12345"
}
Button(onClick = { key = 1 }) {
Text(text = "abcde")
}
Text(text = text)
}
}
}
На экране после нажатия producer снова
покажет "abcde", затем "12345".
Смотрите также
-
функция
LaunchedEffect,
которая не возвращает State -
функция
collectAsState,
которая собирает Flow в State -
класс
State,
который возвращает produceState -
функция
derivedStateOf,
которая считает значение синхронно