Flutter使用onGenerateRoute路由报错,直接用Routes正常
解决Flutter中onGenerateRoute路由跳转的NoSuchMethodError问题
我看到你遇到的问题了——当使用onGenerateRoute跳转CatMealsScreen时出现了NoSuchMethodError,提示[]方法在null上被调用,而直接用routes配置却能正常运行。这是因为onGenerateRoute的实现没有正确传递必要的参数和路由参数,咱们一步步来修复:
问题根源
- 未传递核心构造参数:
CatMealsScreen的构造函数需要接收_availableMeals2参数(也就是主文件里的_availableMeals),但你在onGenerateRoute里直接返回CatMealsScreen(),完全没传这个参数,不仅会导致后续餐品列表加载失败,还会间接引发参数解析错误。 - 未处理路由参数
settings.arguments:CatMealsScreen里依赖ModalRoute.of(context).settings.arguments获取分类的title和id,但onGenerateRoute的旧实现没有确保这个参数被传递到新页面,导致routeArg为null,调用routeArg['tittle']时触发了空指针错误。
修复步骤
1. 修正onGenerateRoute的实现
在主文件的onGenerateRoute方法中,需要同时传递构造参数和保留路由参数:
onGenerateRoute: (settings) { // 根据路由名称判断要跳转的页面 if (settings.name == CatMealsScreen.routesNames) { // 传递_availableMeals构造参数,同时保留原路由的settings(包含arguments) return MaterialPageRoute( builder: (ctx) => CatMealsScreen(_availableMeals), settings: settings, ); } // 可以在这里扩展其他路由的处理逻辑 if (settings.name == MealDetail.routeNmaes) { return MaterialPageRoute( builder: (ctx) => MealDetail(_toggleMeals, isFavMeal), settings: settings, ); } // 默认返回首页避免异常 return MaterialPageRoute(builder: (ctx) => TabsScreen(_favouriteMeals)); },
2. 给CatMealsScreen添加空安全防护(可选但推荐)
为了避免类似的空指针问题,你可以在didChangeDependencies里提前判断参数是否为空:
@override void didChangeDependencies() { if (!_loadInitData) { final routeArg = ModalRoute.of(context)?.settings?.arguments as Map<String, String>?; if (routeArg != null) { catTittle = routeArg['tittle'] ?? '未知分类'; final catId = routeArg['id']; displayMeals = catId != null ? widget._availableMeals2.where((meal) => meal.categories.contains(catId)).toList() : []; } else { catTittle = '未知分类'; displayMeals = []; } _loadInitData = true; } super.didChangeDependencies(); }
3. 确认跳转时传递了正确的参数
确保你跳转到CatMealsScreen时,确实传递了包含tittle和id的Map:
Navigator.of(context).pushNamed( CatMealsScreen.routesNames, arguments: { 'tittle': '意大利菜', 'id': 'c1', }, );
为什么直接用routes配置没问题?
因为在routes里你正确传递了_availableMeals构造参数:
CatMealsScreen.routesNames: (ctx) => CatMealsScreen(_availableMeals),
同时跳转时传递的arguments会被Flutter自动传递到目标页面,所以整个流程能正常运行。而onGenerateRoute的旧实现既没传构造参数,也没正确处理路由参数,才导致了错误。
内容的提问来源于stack exchange,提问作者Al Sayed Abd Elbaqey
相关产品推荐
相关产品推荐

