【问题标题】:how to launch a coroutine inside a composable in Android Jetpack Compose如何在 Android Jetpack Compose 的可组合物中启动协程
【发布时间】:2021-04-18 19:50:36
【问题描述】:

我创建了一个从 viewModel 获取项目的 LazyColumn,并且每件事都运行良好,但是 我想要的是当一个新项目插入到惰性列中时,我想要新项目的背景颜色变绿2秒,然后变回白色。 这是我为实现这一目标所做的,但该项目一直是绿色的:

@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)
    }
}

Here is a Screen shot of what I am talking about

【问题讨论】:

    标签: android kotlin android-jetpack-compose


    【解决方案1】:

    您可以使用返回CoroutineScoperememberCoroutineScope 函数。
    比如:

    // Create a CoroutineScope that follows this composable's lifecycle
    val composableScope = rememberCoroutineScope()
    
    composableScope.launch {
        //... your code
    }
    

    更多信息here

    【讨论】:

    • 现在它给出了一些警告:“启动调用应该发生在 LaunchedEffect 而不是组合内”
    • @brucemax 您必须在任何非撰写功能(如 onClick)上运行它
    【解决方案2】:

    表达式,

    val color: MutableState<Color> = remember {
        if (new.value)
            mutableStateOf(Color(0xFFB9F6CA))
        else
            mutableStateOf(Color(0xFFFDFDFD))
    }
    

    应该是,

    val color = if (new.value) Color(0xFFB9F6CA) else Color(0xFFDFDFD)
    

    remember 的 lambda 只为组合调用一次,并且在 new 更改时不会被视为无效。不需要 rememberColor() 值,因为它足够快,只要 new.value 发生变化就重复它不会对合成造成重大负担。

    另外,正如 Gabriele Mariotti 建议的那样,使用组合作用域而不是 Global。在这种情况下,这并不重要,因为它可能会使对 new 的引用比需要的时间长 2 秒,但这是一个非常好的习惯,因为当您使用组合上下文时,协程被取消当不再需要合成时自动自动(例如将行滚动到屏幕外)。

    此外,如果颜色不仅仅是用于查看协程效果的占位符,请考虑为此使用动画,因为您可能希望颜色进行过渡而不是捕捉。

    【讨论】:

    • 现在一切正常,感谢动画提示
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-19
    • 1970-01-01
    • 1970-01-01
    • 2022-08-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多