如何避免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
相关产品推荐
相关产品推荐

