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

如何确认showMaterialModalBottomSheet底部弹窗已完全消失?

确认MaterialModalBottomSheet完全消失的解决方案

当使用await showMaterialModalBottomSheet()时,Future会在弹窗开始关闭动画的第一帧就完成,无法直接拿到弹窗完全消失的通知。可以通过以下两种方式解决:

方法一:监听弹窗路由的Dispose事件

在弹窗的builder中获取当前的ModalBottomSheetRoute,监听其dispose()方法,当路由被销毁时,就代表弹窗已完全消失:

await showMaterialModalBottomSheet(
  context: context,
  builder: (context) {
    // 获取当前弹窗对应的路由
    final sheetRoute = ModalRoute.of(context) as ModalBottomSheetRoute;
    // 监听路由销毁事件
    sheetRoute.dispose().then((_) {
      // 弹窗已完全消失,执行后续逻辑
      print("底部弹窗已完全关闭");
    });
    return Container(
      height: 250,
      color: Colors.white,
      child: const Center(child: Text("测试弹窗")),
    );
  },
);

方法二:使用自定义NavigatorObserver追踪路由

创建一个自定义的NavigatorObserver,在路由被弹出(didPop)时判断是否为底部弹窗路由,以此触发完全关闭的回调:

1. 定义Observer类

class BottomSheetCloseObserver extends NavigatorObserver {
  final VoidCallback? onBottomSheetFullyClosed;

  BottomSheetCloseObserver({this.onBottomSheetFullyClosed});

  @override
  void didPop(Route route, Route? previousRoute) {
    super.didPop(route, previousRoute);
    // 判断弹出的路由是否为底部弹窗路由
    if (route is ModalBottomSheetRoute) {
      onBottomSheetFullyClosed?.call();
    }
  }
}

2. 注册Observer到MaterialApp

MaterialApp(
  navigatorObservers: [
    BottomSheetCloseObserver(
      onBottomSheetFullyClosed: () {
        // 弹窗完全消失后的逻辑
        print("底部弹窗已完全关闭");
      },
    ),
  ],
  // 其他配置
)

方法一更适合单次弹窗的场景,方法二则适合全局需要监听所有底部弹窗关闭的场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 06:10:30