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
相关产品推荐
相关产品推荐

