Flutter Web中go_router_builder路径参数类型转换异常如何捕获处理?
处理go_router_builder路径参数转换异常的方案
当你在使用go_router_builder时,路径参数转换失败(比如把2a转int)抛出的异常不会触发onException、errorBuilder等回调,原因是:go_router_builder生成的参数解析代码会在路由匹配流程之前执行,转换失败时直接抛出异常,没进入到go_router的异常处理链路里。
下面是几种可行的处理方案:
1. 自定义参数解析函数,在页面内处理无效参数
通过给@TypedGoRoute配置parsers参数,自定义参数解析逻辑,让它返回可空类型而非直接抛出异常,然后在页面组件里判断参数有效性并处理。
示例代码:
// 自定义int解析函数,转换失败返回null int? _safeParseInt(String? value) { if (value == null) return null; try { return int.parse(value); } catch (_) { return null; } } @TypedGoRoute<UserRoute>( path: '/users/:userId', parsers: { 'userId': CustomParser<int?>(_safeParseInt), }, ) class UserRoute extends GoRouteData { final int? userId; UserRoute({required this.userId}); @override Widget build(BuildContext context, GoRouterState state) { if (userId == null) { // 显示参数无效的错误页面 return Scaffold( body: Center(child: Text('用户ID格式无效,请输入正确的数字')), ); } // 参数有效,渲染正常页面 return UserDetailPage(userId: userId!); } }
2. 用redirect钩子提前拦截无效参数
在创建GoRouter实例时,通过redirect回调提前检查路径参数格式,一旦发现无效参数就重定向到错误页面,这种方式能在进入页面之前就拦截问题。
示例代码:
final router = GoRouter( routes: $appRoutes, redirect: (context, state) { // 针对/users/:userId路由做参数检查 if (state.matchedLocation.startsWith('/users/')) { final userIdStr = state.pathParameters['userId']; if (userIdStr != null) { bool isValidInt = int.tryParse(userIdStr) != null; if (!isValidInt) { // 重定向到自定义错误页 return '/invalid-parameter'; } } } // 参数正常,继续路由 return null; }, // 配置错误页,用于处理其他路由异常 errorPageBuilder: (context, state) => MaterialPage( child: Scaffold( body: Center(child: Text('页面加载失败:${state.error?.message}')), ), ), );
3. 全局异常捕获(兜底)
如果前两种方案无法覆盖所有场景,可以用Flutter的全局异常捕获机制作为兜底,比如在runApp前设置全局错误处理:
void main() { FlutterError.onError = (details) { // 捕获全局Flutter异常,包括参数转换失败的情况 FlutterError.presentError(details); // 可以在这里做跳转或日志上报 }; runApp(MyApp()); }
不过这种方式属于兜底方案,建议优先用前两种针对性的处理方式,避免全局捕获带来的不确定性。
内容的提问来源于stack exchange,提问作者Christian
相关产品推荐
相关产品推荐

