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

Flutter使用RouteGenerator路由跳转时报Undefined name 'context'错误如何解决

错误根因

你遇到的Undefined name 'context'报错来自以下两个问题:

  • initState是State类的初始化生命周期方法,执行时Widget还未完全挂载到组件树,该作用域下没有可直接使用的有效context变量
  • 你在initState中自行定义的demo_projects完全冗余,和全局的demo_projects没有关联,同时你给InkWell配置的onTap是空实现,就算context合法也无法触发跳转

修复方案

方案1:直接在卡片点击处处理路由跳转(推荐,逻辑最简洁)

  1. 删掉_ProjectCardState类中的demo_projects声明和整个initState方法
  2. 将InkWell的onTap绑定路由跳转逻辑,这里可以拿到build方法传入的有效context
    修改后的ProjectCard相关代码如下:
class _ProjectCardState extends State<ProjectCard> {
  @override
  Widget build(BuildContext context) {
    return InkWell(
      onTap: () {
        Navigator.pushNamed(context, '/second');
      },
      // 其余原有Container代码保持不变
    );
  }
}
  1. 可选:如果你不需要自定义每个项目的点击事件,可以直接删掉Project类中的onTap属性,以及全局demo_projects初始化时传的onTap参数

方案2:保留Project的自定义onTap能力

如果你需要给不同的Project配置不同的点击逻辑,可以按以下步骤修改:

  1. 同样删掉_ProjectCardState类中的demo_projects声明和整个initState方法
  2. 将InkWell的onTap绑定传入的project的onTap属性:
InkWell(
  onTap: widget.project.onTap,
  // 其余原有代码保持不变
)
  1. 在ProjectsGridView的itemBuilder中构造Project时传入带有效context的回调:
itemBuilder: (context, index) {
  final originalProject = demo_projects[index];
  return ProjectCard(
    project: Project(
      title: originalProject.title,
      description: originalProject.description,
      onTap: () => Navigator.pushNamed(context, '/second'),
    ),
  );
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 04:06:04