状态取决于另一个状态,Android Compose



我有一个compositable,它得到一个可变状态的整数!

整数是一个计时器值!像0,每秒钟增加一次

我必须在compositable中做的是转换为可表示的字符串,比如60秒我将显示1分钟

所以我做这个

val timeString = remember {
mutableStateOf("00:00")
}
val durationString  = if(duration!=0) {
var secondTime = ((duration / 1000) % 60).toString()
var minuteTime = ((((duration / 1000) / 60) % 60)).toString()
if (secondTime.length == 1) {
secondTime = "0$secondTime"
}
if (minuteTime.length == 1) {
minuteTime = "0$minuteTime"
}
"$minuteTime:$secondTime"
}else{
"00:00"
}

timeString.value = durationString
Text(
modifier = Modifier
.weight(1f)
.padding(horizontal = 16.dp),
text = timeString.value,
style = MaterialTheme.typography.h4
)

但文本不会更新,但由于持续时间是一种可变的状态,如果我直接使用它,文本会更新,所以我尝试了LaunchedEffect,但它不起作用,我想知道在撰写中我能做到这一点的最佳方式是什么!

就像我的评论中提到的,你需要扭曲每次在member中应该重新计算的内容,并将状态作为键传递(需要这样compose才能知道它必须更新String(。

参见示例代码:

@Composable
fun outer() {
val durationState = remember { mutableStateOf(600000) }
LaunchedEffect(durationState) {
// This not how you do a timer but close enough
val step = 1000
repeat(600000.div(step)) {
durationState.value = durationState.value - step
delay(step.toLong())
}
}
questionComposable(durationState)
}
@Composable
fun questionComposable(durationState: MutableState<Int>) {
val durationString = remember(durationState.value) {
val duration = durationState.value
if (duration != 0) {
var secondTime = ((duration / 1000) % 60).toString()
var minuteTime = ((((duration / 1000) / 60) % 60)).toString()
if (secondTime.length == 1) {
secondTime = "0$secondTime"
}
if (minuteTime.length == 1) {
minuteTime = "0$minuteTime"
}
"$minuteTime:$secondTime"
} else {
"00:00"
}
}
Text(
text = durationString,
style = MaterialTheme.typography.h4
)
}

最新更新