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

HorizontalPager超出边界页面未触发DisposableEffect的onDispose问题

Jetpack Compose HorizontalPager:非活跃页面DisposableEffect触发问题

问题描述

使用Jetpack Compose 1.4.1的HorizontalPager,设置beyondBoundsPageCount = 1时,超出边界的页面被移除组合后,DisposableEffect的onDispose方法未触发。需明确使用何种key,确保页面变为非活跃(停止组合)时执行onDispose。

场景:Pager包含5个页面,同一时间仅2-3个页面处于组合状态,其余页面被移除。

解决方案

将DisposableEffect的key设置为页面的唯一标识(如页面index或pageData的唯一ID),使DisposableEffect的生命周期与页面的组合状态完全绑定。当页面被移除组合时,onDispose会自动触发;页面重新进入组合范围时,会重新执行DisposableEffect的body块。

修改后的PageScreen代码

@Composable
fun PageScreen(
  pageData: PageData,
  index: Int
) {
  // 使用index作为唯一key,绑定页面的DisposableEffect生命周期
  DisposableEffect(key1 = index) { 
    Timber.d("DisposableEffect body at $index")

    onDispose {
      Timber.d("DisposableEffect onDispose at $index")
    }
  }
}

补充说明

  • HorizontalPager会将超出beyondBoundsPageCount范围的页面组件从组合树中移除,此时与该组件关联的DisposableEffect会销毁并触发onDispose。
  • 若pageData包含业务唯一标识(如id字段),也可使用pageData.id作为key,适配数据驱动的场景,效果一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 15:32:46