Flutter:在Scaffold的FAB的onPressed中调用showSnackBar报错求助
嘿,这个坑我之前踩过!你遇到的错误本质是context的作用域不匹配——你用来调用Scaffold.of(context)的context,和当前Scaffold属于同一个层级,所以它没法找到上层的Scaffold实例。官方文档里针对body的方案之所以在FAB这里没用,是因为FloatingActionButton是Scaffold的一个直接参数(和body同级),而非Scaffold的子widget,所以它的context并不能访问到Scaffold的State。
下面给你两种最常用的解决方案:
方案一:用Builder组件包裹FloatingActionButton
Builder会为FAB提供一个新的context,这个context是Scaffold的子级,自然就能找到Scaffold的实例了:
Scaffold( floatingActionButton: Builder( builder: (context) { return FloatingActionButton( onPressed: () { Scaffold.of(context).showSnackBar( SnackBar(content: Text("Snack text")), ); }, child: const Icon(Icons.add), ); }, ), // 你的其他Scaffold配置,比如body、appBar等 )
方案二:使用GlobalKey获取ScaffoldState
如果需要在多个地方(不止FAB)访问Scaffold的状态,这种方法会更灵活:
- 先定义一个全局的
GlobalKey<ScaffoldState> - 把这个key赋值给Scaffold的
key属性 - 直接通过
key.currentState调用showSnackBar
代码示例:
final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>(); @override Widget build(BuildContext context) { return Scaffold( key: _scaffoldKey, floatingActionButton: FloatingActionButton( onPressed: () { // 注意这里用?.避免空指针 _scaffoldKey.currentState?.showSnackBar( const SnackBar(content: Text("Snack text")), ); }, child: const Icon(Icons.add), ), // 其他Scaffold配置 ); }
这两种方法都能完美解决你的问题,根据自己的场景选就行~
内容的提问来源于stack exchange,提问作者Tree
相关产品推荐
相关产品推荐

