Flutter使用RouteGenerator路由跳转时报Undefined name 'context'错误如何解决
错误根因
你遇到的Undefined name 'context'报错来自以下两个问题:
initState是State类的初始化生命周期方法,执行时Widget还未完全挂载到组件树,该作用域下没有可直接使用的有效context变量- 你在
initState中自行定义的demo_projects完全冗余,和全局的demo_projects没有关联,同时你给InkWell配置的onTap是空实现,就算context合法也无法触发跳转
修复方案
方案1:直接在卡片点击处处理路由跳转(推荐,逻辑最简洁)
- 删掉
_ProjectCardState类中的demo_projects声明和整个initState方法 - 将
InkWell的onTap绑定路由跳转逻辑,这里可以拿到build方法传入的有效context
修改后的ProjectCard相关代码如下:
class _ProjectCardState extends State<ProjectCard> { @override Widget build(BuildContext context) { return InkWell( onTap: () { Navigator.pushNamed(context, '/second'); }, // 其余原有Container代码保持不变 ); } }
- 可选:如果你不需要自定义每个项目的点击事件,可以直接删掉
Project类中的onTap属性,以及全局demo_projects初始化时传的onTap参数
方案2:保留Project的自定义onTap能力
如果你需要给不同的Project配置不同的点击逻辑,可以按以下步骤修改:
- 同样删掉
_ProjectCardState类中的demo_projects声明和整个initState方法 - 将
InkWell的onTap绑定传入的project的onTap属性:
InkWell( onTap: widget.project.onTap, // 其余原有代码保持不变 )
- 在
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
相关产品推荐
相关产品推荐

