如何通过scaffoldKey判断Flutter中Scaffold的bottomSheet是否打开
如何判断Scaffold的BottomSheet是否处于打开状态
方案一:手动维护状态标记(推荐)
由于官方未提供直接判断的API,最稳妥可靠的方式是自行维护一个布尔变量,记录当前是否有BottomSheet处于打开状态:
- 定义状态变量:
bool _isBottomSheetOpen = false;
- 打开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); }
- 针对多个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
相关产品推荐
相关产品推荐

