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

如何通过scaffoldKey判断Flutter中Scaffold的bottomSheet是否打开

如何判断Scaffold的BottomSheet是否处于打开状态

方案一:手动维护状态标记(推荐)

由于官方未提供直接判断的API,最稳妥可靠的方式是自行维护一个布尔变量,记录当前是否有BottomSheet处于打开状态:

  1. 定义状态变量:
bool _isBottomSheetOpen = false;
  1. 打开BottomSheet时更新状态,并监听关闭事件:
void _showBottomSheet() {
  final controller = scaffoldKey.currentState!.showBottomSheet(
    (context) => Container(
      height: 200,
      color: Colors.white,
      child: const Center(child: Text('BottomSheet')),
    ),
  );
  _isBottomSheetOpen = true;
  // 监听BottomSheet关闭,同步更新状态
  controller.closed.then((_) => _isBottomSheetOpen = false);
}
  1. 针对多个BottomSheet的场景,因为同一时间Scaffold只能显示一个BottomSheet,所以只需确保每次打开时将_isBottomSheetOpen设为true,每个BottomSheet关闭时将其设为false即可,不会出现状态冲突。

方案二:通过扩展ScaffoldState访问内部状态(谨慎使用)

Flutter的ScaffoldState内部存在私有成员_bottomSheet,可以通过扩展类访问它来判断状态:

extension ScaffoldStateExtension on ScaffoldState {
  bool get isBottomSheetOpen => _bottomSheet != null;
}

使用时直接通过scaffoldKey判断:

bool isOpen = scaffoldKey.currentState!.isBottomSheetOpen;

⚠️ 注意:该方式依赖Flutter框架的内部实现,若未来版本中_bottomSheet的命名或逻辑变更,代码会失效,仅建议在无法使用方案一的场景下尝试。

补充说明

  • Scaffold同一时间仅能显示一个BottomSheet,因此维护单个状态标记即可覆盖多BottomSheet的场景。
  • mounted属性仅用于判断Widget是否挂载,无法反映BottomSheet的显示状态,不适用此需求。

内容的提问来源于stack exchange,提问作者A-E

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 12:05:53