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

如何通过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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 12:28:28