如何通过go_router传递可选的List类型参数?
解决go_router传递可选List参数的类型错误问题
问题根源
你遇到的错误是因为state.extra默认被解析为List<dynamic>类型,无法直接赋值给List<int>变量,同时你没有处理参数可选(即extra为null)的场景。
解决方案
方法1:安全类型转换+处理null
直接对state.extra进行类型检查和转换,同时兼容参数未传递的情况:
final GoRouter _router = GoRouter(routes: [ GoRoute( name: 'loading', path: '/', builder: (context, state) { List<int>? genres; if (state.extra is List) { genres = (state.extra as List).cast<int>(); } return Loading(genres: genres); }, ), // 其他路由... ]);
或者更简洁的写法:
builder: (context, state) { List<int>? genres = state.extra != null ? (state.extra as List).cast<int>() : null; return Loading(genres: genres); }
方法2:类型断言+空判断
如果能保证传递的extra一定是List<int>或null,可以用更直接的断言:
builder: (context, state) { List<int>? genres = state.extra as List<int>?; return Loading(genres: genres); }
这种写法更简洁,但如果传递的extra不是List<int>类型,会抛出类型转换错误,适合内部跳转、参数类型可控的场景。
方法3:通过Query参数传递(可选方案)
如果不想用extra传递,也可以将List序列化为字符串通过Query参数传递:
跳转时:
// 将List<int>转为逗号分隔的字符串 context.go('/?genres=${[1,2,3].join(',')}');
路由解析时:
final GoRouter _router = GoRouter(routes: [ GoRoute( name: 'loading', path: '/', builder: (context, state) { final genresStr = state.uri.queryParameters['genres']; List<int>? genres = genresStr?.split(',').map(int.parse).toList(); return Loading(genres: genres); }, ), ]);
这种方法适合需要分享链接的场景,但要注意处理解析异常(比如非数字字符串)。
补充说明
跳转时如果不需要传递genres参数,直接调用context.go('/')即可,此时state.extra为null,Loading组件的genres会自动设为null,符合你的可选参数设计。
内容的提问来源于stack exchange,提问作者Duddy67
相关产品推荐
相关产品推荐

