状态取决于另一个状态,即Android Compose
我有一个composable,它得到一个整数,这是一个可变状态 整数是一个计时器值!就像0,它每秒钟增加一次 我必须在composable中做的是转换成可表示的字符串,比如60秒,我将显示1分钟 所以我这么做状态取决于另一个状态,即Android Compose,android,android-jetpack-compose,Android,Android Jetpack Compose,我有一个composable,它得到一个整数,这是一个可变状态 整数是一个计时器值!就像0,它每秒钟增加一次 我必须在composable中做的是转换成可表示的字符串,比如60秒,我将显示1分钟 所以我这么做 val timeString = remember { mutableStateOf("00:00") } val durationString = if(duration!=0) { var secondTime =
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
)
但是文本不会更新,但是由于持续时间是一个可变的状态,如果我直接使用它,文本会更新,所以我尝试了LauncheDefect,但它不起作用。我想知道在compose中我能做到这一点的最佳方法是什么 就像我在评论中提到的那样,您需要在内存中扭曲每次应该重新计算的内容,并将状态作为键传递(需要这样才能让compose知道它必须更新字符串) 请参见示例代码:
@Composable
有趣的外表{
val durationState=记住{mutableStateOf(600000)}
LauncheDefect(持续状态){
//这不是计时器的工作方式,但已经足够接近了
val阶跃=1000
重复(600000.div(步骤)){
durationState.value=durationState.value-步骤
延迟(步骤toLong())
}
}
可组合问题(durationState)
}
@组合的
有趣的问题组合(durationState:MutableState){
val durationString=记住(durationState.value){
val duration=durationState.value
如果(持续时间!=0){
var secondTime=((持续时间/1000)%60).toString()
var minuteTime=(((持续时间/1000)/60)%60)).toString()
if(secondTime.length==1){
secondTime=“0$secondTime”
}
if(minuteTime.length==1){
minuteTime=“0$minuteTime”
}
“$minuteTime:$secondTime”
}否则{
"00:00"
}
}
正文(
text=durationString,
样式=材料主题。排版。h4
)
}
我还尝试创建另一个文本状态,并使用launchedefect更新文本状态值,但它没有使用记住(持续时间){/*your if*/}更新text wrap your if
如果您想知道我建议您阅读remember文档的原因,请同时提供州创建/通过的代码。您可以做一些不同的事情。使用倒计时定义ViewModel
代码>并在可组合函数中使用如下内容:val secs=countTimeViewModel.seconds.observeastate()
仍然不工作我正在从父组件获取持续时间状态作为参数,但它被记住了,唯一有效的时间是如果我直接将其放入,另外,duration状态的值是使用timerTask更新的,timerTask每秒更新一次该值。当您传递它时,该代码也会起作用,如fun ex(durationState:MutableState)
无需烦恼,我只能猜测外部的情况,我更新了解决方案以更接近您的示例。此代码在Compose Desktop和Android上运行