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

Flutter构建导航时提示Undefined name 'widget'错误怎么解决?

问题根因

  • Undefined name 'widget'报错的核心原因是混淆了StatelessWidget与StatefulWidget的属性访问规则:只有StatefulWidget对应的State子类中,才需要通过widget.前缀访问父组件定义的属性;你当前的SecondRoute是StatelessWidget,build方法内直接访问自身成员变量即可,无需加widget.前缀。
  • The return type 'SecondRoute' isn't a 'Widget'报错是因为对StatefulWidget结构理解错误:State类不能直接作为页面组件使用,必须依附于对应的StatefulWidget子类,不能直接将SecondRoute改为继承State。
  • 空值问题一方面是语法书写错误,另一方面是导航跳转时未正确将place实例传递给目标页面,直接用!强制解包也会加大空异常风险。

修复方案

1. StatelessWidget写法(无需改为Stateful场景)

去掉widget.前缀,同时做空值兼容处理:

class SecondRoute extends StatelessWidget {
  final Place? place;
  const SecondRoute({Key? key, this.place}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text("Second Route"),
      ),
      body: Center(
        child: ElevatedButton(
          onPressed: () => Navigator.pop(context),
          // 空值时展示默认兜底文本,避免崩溃
          child: Text(place?.text ?? '暂无数据'),
        ),
      ),
    );
  }
}

2. 确保跳转时正确传参

在上个页面执行跳转逻辑时,必须将已拿到的place实例传入构造方法:

// 跳转代码示例
Navigator.push(
  context,
  MaterialPageRoute(
    // yourPlaceInstance为你从JSON拉取到的Place实例
    builder: (context) => SecondRoute(place: yourPlaceInstance),
  ),
);

3. StatefulWidget标准写法(如有状态管理需求)

如果确实需要使用StatefulWidget,按照规范拆分组件类和State类即可,此时State内可以通过widget.访问属性:

class SecondRoute extends StatefulWidget {
  final Place? place;
  const SecondRoute({Key? key, this.place}) : super(key: key);

  @override
  State<SecondRoute> createState() => _SecondRouteState();
}

class _SecondRouteState extends State<SecondRoute> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text("Second Route"),
      ),
      body: Center(
        child: ElevatedButton(
          onPressed: () => Navigator.pop(context),
          child: Text(widget.place?.text ?? '暂无数据'),
        ),
      ),
    );
  }
}

4. PlaceDetail类的属性访问

在_PlaceDetailState中直接通过widget.place访问传入的参数即可,空值处理逻辑同上。

内容的提问来源于stack exchange,提问作者Johan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 22:24:01