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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 15:24:03