You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Jetpack Compose中使用remember存储协程取消函数?

在Jetpack Compose中管理可取消的搜索协程

要解决remember存储取消函数的问题,核心是用**remember包裹mutableStateOf**来保存可变的取消函数引用——因为remember本身仅保存不可变值,而mutableStateOf提供了可观察的可变状态容器。

具体修改步骤:

  1. 初始化可变状态的取消函数:
    将cancelSearch声明为带remember的mutableStateOf,初始值设为null(表示还未执行过搜索):

    val cancelSearch = remember { mutableStateOf<(() -> Unit)?>(null) }
    
  2. 修改搜索按钮的点击逻辑:
    每次点击时先执行之前的取消函数(如果存在),再启动新搜索并更新取消函数引用:

    Button(
        onClick = {
            // 取消前一次的搜索协程
            cancelSearch.value?.invoke()
            // 启动新搜索并保存新的取消函数
            cancelSearch.value = model.search(coroutineScope)
        },
        modifier = Modifier.weight(1f)
    ) {
        Text("Search")
    }
    

完整的Browser组合函数代码:

@Composable
fun Browser(model: YourModelClass) { // 替换成你的Model实际类型
    val coroutineScope = rememberCoroutineScope()
    val cancelSearch = remember { mutableStateOf<(() -> Unit)?>(null) }

    Button(
        onClick = {
            cancelSearch.value?.invoke()
            cancelSearch.value = model.search(coroutineScope)
        },
        modifier = Modifier.weight(1f)
    ) {
        Text("Search")
    }
}

额外提示:

  • 你的search函数中payments.clear()如果是Compose状态(比如MutableStateList),建议移到主线程执行,因为Compose状态更新必须在主线程:
    fun search(coroutineScope: CoroutineScope): () -> Unit {
        coroutineScope.launch(Dispatchers.Main) {
            payments.clear()
        }
        // 剩余代码保持不变
    }
    

内容的提问来源于stack exchange,提问作者t3chb0t

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 11:47:37