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

如何避免Jetpack Compose中ModalBottomSheet内容重复加载?

解决方案

问题根源在于你把获取朗读文本、加载TTS数据的逻辑直接写在了ModalBottomSheet的content lambda里——Compose每次重组(比如弹窗显示/隐藏、状态变更)都会执行这段代码,导致每次打开弹窗都重复触发逻辑。

要实现「仅在内容变化时重新获取文本」,可以按以下方式修改:

  • 将业务逻辑包裹在LaunchedEffect中,传入所有影响朗读内容的变量作为key,只有当这些变量发生变化时,内部逻辑才会重新执行。
  • 把日志、文本生成、TTS加载的操作都放在LaunchedEffect内部,避免重组时重复触发。

修改后的代码示例:

if (showBottomSheet) {
    ModalBottomSheet(
        onDismissRequest = { showBottomSheet = false },
        sheetState = sheetState,
        content = {
            // 传入影响朗读内容的核心变量作为LaunchedEffect的触发条件
            LaunchedEffect(universalis, typusId, userData) {
                analyticsHelper.logUniversalisTtsEvent(universalisResource.title)
                val read = universalisBodyForRead(universalis, typusId, userData)
                viewModelTts.loadData(read.text)
            }
            ScreenTtsPlayer(viewModelTts)
        },
    ) 
}

关键说明:

  • LaunchedEffect的key参数universalis, typusId, userData是生成朗读文本的核心依赖,只有当其中任意一个变量变化时,内部逻辑才会重新执行。
  • 即使多次关闭再打开弹窗,只要这三个变量没有变化,LaunchedEffect就不会重复执行,也就不会重复获取文本和加载TTS数据。
  • 你之前用LaunchedEffect没生效,大概率是因为没传入完整的依赖变量,导致Compose无法感知内容变化的时机。

内容的提问来源于stack exchange,提问作者A. Cedano

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 23:27:41