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

GoRouter如何通过查询参数传递布尔或整数类型参数?

解决GoRouter传递非字符串类型查询参数无需手动转换的方案

方法1:使用extra传递复杂类型参数

GoRouter的goNamed方法支持通过extra参数传递任意类型数据,无需将布尔值转为字符串,目标路由直接从state.extra获取原始类型值。

基础用法(用Map传递)

传递参数:

routes.goNamed(
  'confirm',
  extra: {
    'isLogin': true,
  },
);

接收参数:

GoRoute(
  name: 'confirm',
  path: 'confirm',
  builder: (context, state) {
    final args = state.extra as Map<String, dynamic>;
    return AuthConfirmPage(
      isLogin: args['isLogin'] as bool,
    );
  },
),

更规范的方式(自定义参数类)

定义参数实体类:

class ConfirmPageArgs {
  final bool isLogin;
  ConfirmPageArgs({required this.isLogin});
}

传递参数:

routes.goNamed(
  'confirm',
  extra: ConfirmPageArgs(isLogin: true),
);

接收参数:

GoRoute(
  name: 'confirm',
  path: 'confirm',
  builder: (context, state) {
    final args = state.extra as ConfirmPageArgs;
    return AuthConfirmPage(
      isLogin: args.isLogin,
    );
  },
),

方法2:给GoRouterState添加扩展方法封装类型转换

如果必须使用URL查询参数(比如需要参数出现在地址栏),可以给GoRouterState写一个扩展方法,统一处理布尔值、整数等类型的解析,避免重复写bool.parse。

定义扩展:

extension GoRouterStateExtension on GoRouterState {
  /// 从query参数中获取布尔值
  bool? getBool(String key) {
    final value = queryParameters[key];
    if (value == null) return null;
    return value.toLowerCase() == 'true';
  }

  /// 从query参数中获取整数值
  int? getInt(String key) {
    final value = queryParameters[key];
    return value != null ? int.tryParse(value) : null;
  }
}

使用扩展接收参数:

GoRoute(
  name: 'confirm',
  path: 'confirm',
  builder: (context, state) {
    return AuthConfirmPage(
      isLogin: state.getBool('isLogin')!,
    );
  },
),

方法3:使用TypedGoRoute(GoRouter 6.5+版本支持)

GoRouter 6.5及以上版本提供了类型化路由(TypedGoRoute),可以自动处理参数的序列化与反序列化,完全无需手动转换类型。

定义类型化路由

class ConfirmRoute extends GoRouteData {
  final bool isLogin;
  
  ConfirmRoute({required this.isLogin});

  @override
  Widget build(BuildContext context, GoRouterState state) {
    return AuthConfirmPage(isLogin: isLogin);
  }
}

注册路由

GoRouter(
  routes: [
    ConfirmRoute().route,
    // 其他路由
  ],
);

跳转路由

ConfirmRoute(isLogin: true).go(context);

内容的提问来源于stack exchange,提问作者vrMan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 05:12:39