Flutter点击BottomNavigationBar切换页面时BottomSheet未自动关闭问题求助
问题根因
你遇到的问题核心是两类底部工作表的实现逻辑差异:showBottomSheet创建的是常驻底部工作表,不属于Flutter路由栈管理范围,仅挂载在当前页面的Scaffold下,所以页面销毁时不会自动触发关闭逻辑。而showModalBottomSheet创建的是模态底部工作表,本身是独立的路由条目,会跟随所属页面的路由操作自动销毁。
解决方案1:保留showBottomSheet的处理方法
- 首先存储
showBottomSheet返回的控制器实例:
PersistentBottomSheetController? _bottomSheetController; void _showForm(int id) async { _bottomSheetController = showBottomSheet( context: context, elevation: 5, builder: (context) => BottomSheetSwitch(_refreshJournals, id)); }
- 在第一个页面的
dispose生命周期方法中添加关闭逻辑,页面销毁时自动关闭未隐藏的底部工作表:
@override void dispose() { _bottomSheetController?.close(); super.dispose(); }
解决方案2:使用showModalBottomSheet的全屏适配实现
如果选用你当前正在使用的模态底部工作表方案,仅需配置isScrollControlled参数即可实现全屏高度适配,无需额外手动管理关闭逻辑:
void _showForm(int id) async { showModalBottomSheet( context: context, isScrollControlled: true, // 允许底部工作表占满全屏高度 elevation: 5, builder: (context) => Container( // 可自定义高度比例,0.9即占屏幕高度90%,设为1则完全全屏 height: MediaQuery.of(context).size.height * 0.9, child: BottomSheetSwitch(_refreshJournals, id), ), ); }
该方案的底部工作表自带点击空白区域关闭的交互,且切换BottomNavigationBar页面时会自动销毁,更适合表单类场景使用。
内容的提问来源于stack exchange,提问作者sam fisher
相关产品推荐
相关产品推荐

