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

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的状态实例:

  1. 在_MyHomePageState中定义Scaffold的全局键:
class _MyHomePageState extends State<MyHomePage> {
  final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>();
  // 原有其他变量不变
  1. 给Scaffold绑定这个全局键:
@override
Widget build(BuildContext context) {
  return Scaffold(
    key: _scaffoldKey,
    // 原有其他Scaffold配置不变
  );
}
  1. 修改_startNewTransaction方法,直接通过全局键调用showBottomSheet,无需传入context:
void _startNewTransaction() {
  _scaffoldKey.currentState?.showBottomSheet(
    (_) {
      return GestureDetector(
        onTap: () {},
        child: NewTransaction(_addNewTransaction),
        behavior: HitTestBehavior.opaque,
      );
    },
  );
}
  1. 对应修改两处onPressed调用,删除context参数传递:
// IconButton的onPressed
onPressed: () => _startNewTransaction(),
// FloatingActionButton的onPressed
onPressed: () => _startNewTransaction(),

内容的提问来源于stack exchange,提问作者Md. Fazle Rabbi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 16:36:01