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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 05:30:02