Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/227.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
状态取决于另一个状态,即Android Compose_Android_Android Jetpack Compose - Fatal编程技术网

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

状态取决于另一个状态,即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 =

我有一个composable,它得到一个整数,这是一个可变状态

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

我必须在composable中做的是转换成可表示的字符串,比如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
        )

但是文本不会更新,但是由于持续时间是一个可变的状态,如果我直接使用它,文本会更新,所以我尝试了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上运行