如何在Android Jetpack Compose中的可组合程序中启动协同程序
我创建了一个LazyColumn,它从viewModel中获取项目,一切都很正常,但是我想要的是,当一个新项目插入到lazy column中时,我希望新项目的背景色为绿色2秒钟,然后变回白色。 以下是我为实现这一目标所做的工作,但该项目一直是绿色的:如何在Android Jetpack Compose中的可组合程序中启动协同程序,android,kotlin,android-jetpack-compose,Android,Kotlin,Android Jetpack Compose,我创建了一个LazyColumn,它从viewModel中获取项目,一切都很正常,但是我想要的是,当一个新项目插入到lazy column中时,我希望新项目的背景色为绿色2秒钟,然后变回白色。 以下是我为实现这一目标所做的工作,但该项目一直是绿色的: @Composable fun SingleItem(item: Item) { val new = remember { mutableStateOf(true) } val color: MutableState<Color>
@Composable
fun SingleItem(item: Item) {
val new = remember {
mutableStateOf(true)
}
val color: MutableState<Color> = remember {
if (new.value)
mutableStateOf(Color(0xFFB9F6CA))
else
mutableStateOf(Color(0xFFFDFDFD))
}
Card(
modifier = Modifier
.padding(4.dp)
.fillMaxWidth(),
shape = RoundedCornerShape(8.dp),
backgroundColor = color.value
) {
GlobalScope.launch {
delay(2000)
new.value= !new.value
}
Column(
modifier = Modifier
.fillMaxWidth(),
horizontalAlignment = Alignment.Start,
verticalArrangement = Arrangement.SpaceBetween
) {
Text(text = item.name, style = MaterialTheme.typography.h5)
Text(text = "${item.quantity}", style = MaterialTheme.typography.h6)
}
}
@Composable
趣味单品(品目:品目){
val new=记住{
可变状态(true)
}
val颜色:可变状态=记住{
if(新的.value)
可变状态(颜色(0xFFB9F6CA))
其他的
可变状态(颜色(0xFFFDFD))
}
卡片(
修饰语=修饰语
.填充(4.dp)
.fillMaxWidth(),
形状=圆形拐角形状(8.dp),
backgroundColor=color.value
) {
环球镜发射{
延迟(2000年)
new.value=!new.value
}
纵队(
修饰语=修饰语
.fillMaxWidth(),
水平对齐=对齐。开始,
垂直排列=排列。间距
) {
文本(Text=item.name,style=MaterialTheme.typography.h5)
Text(Text=“${item.quantity}”,style=MaterialTheme.typography.h6)
}
}
您可以使用返回CoroutineScope
的函数比如:
// Create a CoroutineScope that follows this composable's lifecycle
val composableScope = rememberCoroutineScope()
composableScope.launch {
//... your code
}
更多信息。您可以使用返回CoroutineScope
的函数比如:
// Create a CoroutineScope that follows this composable's lifecycle
val composableScope = rememberCoroutineScope()
composableScope.launch {
//... your code
}
更多信息。表达式
val color: MutableState<Color> = remember {
if (new.value)
mutableStateOf(Color(0xFFB9F6CA))
else
mutableStateOf(Color(0xFFFDFDFD))
}
要记住的lambda对于合成只有一次调用,并且在new
更改时不会被视为无效。无需记住aColor()
value,因为它的速度足够快,只要new.value
is发生更改,就可以重复它,这不会对合成造成很大负担
此外,正如Gabriele Mariotti所建议的,使用合成范围而不是全局
。在这种情况下,这并不重要,因为它可能会使对新
的引用比需要的时间长2秒,但进入as是一个非常好的习惯,当您使用合成上下文时,协作被取消当不再需要构图时(如屏幕上的行滚动)
此外,如果颜色不是一个占位符来查看一个协同程序的效果,请考虑使用动画,因为您可能希望颜色转换而不是SNAP。
< P>表达式,
val color: MutableState<Color> = remember {
if (new.value)
mutableStateOf(Color(0xFFB9F6CA))
else
mutableStateOf(Color(0xFFFDFDFD))
}
要记住的lambda对于合成只有一次调用,并且在new
更改时不会被视为无效。无需记住aColor()
value,因为它的速度足够快,只要new.value
is发生更改,就可以重复它,这不会对合成造成很大负担
此外,正如Gabriele Mariotti所建议的,使用合成范围而不是全局
。在这种情况下,这并不重要,因为它可能会使对新
的引用比需要的时间长2秒,但进入as是一个非常好的习惯,当您使用合成上下文时,协作被取消当不再需要构图时(如屏幕上的行滚动)
此外,如果颜色不是一个占位符来查看协同程序的效果,那么考虑使用动画,因为您可能希望颜色转换而不是SNAP。
尝试使用:<代码> Valo CordOutStudio = RealCyOutOnEclipse()。
和coroutineScope.launch
尝试使用:val coroutineScope=rememberCoroutineScope()
和coroutineScope.launch
现在一切正常,感谢动画提示一切正常,感谢动画提示帮助分配感谢帮助分配感谢