Flutter如何不使用if判断实现onGenerateRoute路由配置?
报错原因
- 路由名不匹配:映射表中
/doit对应的key误写为没有前缀斜杠的doit,若跳转时传入的路由名是/doit就无法命中映射,返回null。 - 空安全校验不通过:
routes[settings.name]的返回值是可空类型WidgetBuilder?,你直接将它赋值给非空的WidgetBuilder变量,Dart运行时会直接抛出空访问异常。 - 类名大小写错误:原有代码中页面类名为
TryLater,改写后的映射表里误写为Trylater,大小写不匹配会触发编译/运行错误。 - 参数强转风险:你直接将
settings.arguments强转为returnArguments类型,若某条路由跳转时没有传入对应类型的参数,会直接抛出类型转换异常。
正确实现方案
你可以用提前定义的路由映射表实现无if判断的路由调度,同时做好异常兼容处理,示例代码如下:
// 提前定义全局路由映射表,避免每次触发onGenerateRoute重复创建 final Map<String, Widget Function(BuildContext, returnArguments)> routeMap = { "/avoid": (ctx, args) => Avoid(info: args.info, url: args.url), "/doit": (ctx, args) => Doit(info: args.info, url: args.url), "/trylater": (ctx, args) => TryLater(info: args.info, url: args.url), // 后续新增路由仅需在此处添加对应条目即可 }; onGenerateRoute: (RouteSettings settings) { // 安全校验参数类型,避免强转报错 final args = settings.arguments; if (args is! returnArguments) { // 参数不符合要求时跳转至通用错误页,可根据业务需求调整 return MaterialPageRoute(builder: (ctx) => const UnknownRoutePage()); } // 查找对应路由的构造器 final pageBuilder = routeMap[settings.name]; if (pageBuilder == null) { // 未匹配到路由时跳转至404页 return MaterialPageRoute(builder: (ctx) => const UnknownRoutePage()); } return MaterialPageRoute( builder: (ctx) => pageBuilder(ctx, args), settings: settings, // 携带原始路由配置,方便后续扩展使用 ); }
如果你的项目中存在需要接收不同参数类型的路由,可以将路由映射表的value类型改为Widget Function(BuildContext, dynamic),在每个路由构造逻辑中单独处理参数即可。
内容的提问来源于stack exchange,提问作者Filipe Gonçalves Ribeiro Costa
相关产品推荐
相关产品推荐

