Flutter点击FloatingButton或AppBar图标提示未找到Scaffold如何解决
问题根因
你调用方法时传入的context是_MyHomePageState.build方法的参数,这个context对应的是MyHomePage组件本身,而你代码里的Scaffold是MyHomePage的子组件(在build方法中返回)。Flutter的of方法会从传入的context开始向上遍历组件树寻找目标组件,自然找不到作为子节点存在的Scaffold,就会抛出该异常。
修复方案
这里提供两种常用的修复方案,按需选择即可:
方案1:使用Builder组件提供子级context
在需要调用Scaffold相关方法的组件外层包裹Builder组件,Builder提供的context属于Scaffold的子级,向上遍历可以找到Scaffold:
- 修改AppBar的actions代码:
actions: <Widget>[ Builder( builder: (context) => IconButton( onPressed: () => _startNewTransaction(context), icon: Icon(Icons.add), ), ), ],
- 修改FloatingActionButton代码:
floatingActionButton: Builder( builder: (context) => FloatingActionButton( onPressed: () => _startNewTransaction(context), child: Icon(Icons.add), ), ),
方案2:使用GlobalKey直接引用ScaffoldState
这种方案不需要修改组件嵌套结构,通过全局键直接获取Scaffold的状态实例:
- 在
_MyHomePageState中定义Scaffold的全局键:
class _MyHomePageState extends State<MyHomePage> { final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>(); // 原有其他变量不变
- 给Scaffold绑定这个全局键:
@override Widget build(BuildContext context) { return Scaffold( key: _scaffoldKey, // 原有其他Scaffold配置不变 ); }
- 修改
_startNewTransaction方法,直接通过全局键调用showBottomSheet,无需传入context:
void _startNewTransaction() { _scaffoldKey.currentState?.showBottomSheet( (_) { return GestureDetector( onTap: () {}, child: NewTransaction(_addNewTransaction), behavior: HitTestBehavior.opaque, ); }, ); }
- 对应修改两处onPressed调用,删除context参数传递:
// IconButton的onPressed onPressed: () => _startNewTransaction(), // FloatingActionButton的onPressed onPressed: () => _startNewTransaction(),
内容的提问来源于stack exchange,提问作者Md. Fazle Rabbi
相关产品推荐
相关产品推荐

