Fragment中点击按钮Compose方法仅调用一次问题求助
问题解决:每次点击按钮触发Composable方法执行
问题原因
你当前的写法中,第一次点击按钮调用composeView.setContent时,Compose会构建对应的UI树。后续再次点击时,Compose会对比新旧setContent中的内容,由于showOverlay没有依赖任何可变状态,Compose判定内容无变化,不会重新执行这个Composable函数,因此日志仅打印一次。
解决方案
方案1:利用状态驱动Compose重组
在Fragment中维护一个可变状态,每次点击按钮时更新状态,让Composable感知到变化从而触发重组:
- 在Fragment中定义状态变量:
private val overlayTrigger = mutableStateOf(0)
- 修改按钮点击事件:
binding.sCashMoneyTransferGiftsSwitch.setOnClickListener { // 更新状态,触发Compose重组 overlayTrigger.value += 1 binding.composeView.setContent { showOverlay(trigger = overlayTrigger.value) } }
- 修改
showOverlay方法,依赖传入的状态:
@Composable fun showOverlay(trigger: Int) { // 状态变化时,Composable会重新执行,日志每次都会打印 Log.e("showverlayTag", "showVodafoneOverlay: ") }
方案2:直接在点击事件中执行逻辑(如果无需Compose UI)
如果你的showOverlay只是执行日志这类非UI逻辑,没必要每次都调用setContent,直接在点击事件里执行即可:
binding.sCashMoneyTransferGiftsSwitch.setOnClickListener { Log.e("showverlayTag", "showVodafoneOverlay: ") // 如果确实需要更新Compose内容,再调用setContent binding.composeView.setContent { // 你的Compose UI内容 } }
内容的提问来源于stack exchange,提问作者Ahmed Mamdouh
相关产品推荐
相关产品推荐

