GoRouter嵌套路由传参出现类型转换错误,求解决方法
解决go_router嵌套路由传递extra时的类型转换错误
这个问题的核心是子路由错误获取了父路由的extra对象,导致类型断言失败。以下是具体排查和解决步骤:
1. 检查路由配置的extra获取逻辑
确保子路由add-to-playlist的builder函数中,从当前路由的state对象获取extra,而非父路由的。示例配置:
GoRoute( path: 'reciter-details/:id', builder: (context, state) { // 父路由获取Reciter类型的extra final reciter = state.extra as Reciter; return ReciterDetailsPage(reciter: reciter); }, routes: [ GoRoute( path: 'add-to-playlist', builder: (context, state) { // 子路由必须从自身state中获取PlaylistItem,不能复用父路由的extra final playlistItem = state.extra as PlaylistItem; return AddToPlaylistPage(item: playlistItem); }, ), ], )
2. 确认跳转时的extra传递正确性
从reciter-details跳转至add-to-playlist时,必须明确传递PlaylistItem类型对象作为extra,避免误传父页面的Reciter对象:
// 正确的跳转代码 context.push( '/reciters/reciter-details/${currentReciter.id}/add-to-playlist', extra: targetPlaylistItem, // 此处必须是PlaylistItem实例 );
3. 添加类型安全校验(可选但推荐)
为避免类型断言崩溃,可在子路由builder中先做类型检查:
builder: (context, state) { final extra = state.extra; if (extra is PlaylistItem) { return AddToPlaylistPage(item: extra); } // 处理extra类型不匹配的情况,比如返回错误提示页 return const Scaffold(body: Center(child: Text('参数错误'))); },
4. 排查是否误用全局路由状态
如果代码中使用GoRouterState.of(context).extra获取参数,注意该方法返回的是当前路由栈顶部路由的extra,若嵌套路由配置有问题,可能意外拿到父路由的extra。建议始终使用builder函数传入的state对象获取当前路由的extra。
内容的提问来源于stack exchange,提问作者shereef hamed
相关产品推荐
相关产品推荐

