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
相关产品推荐
相关产品推荐

