Flutter go_router子路由使用异常:点击ListTile跳转DetailsPage报错
问题原因及修复方案
1. 路由配置错误(核心问题)
你的UserList子路由路径重复添加了userlist,导致路由表中实际匹配的路径是/userlist/userlist/:userId,但你导航的路径是userlist/1(或/userlist/1),两者不匹配,因此触发no routes for location错误,进而引发构建阶段的匹配异常。
修复路由配置
修改子路由的path为:userId(移除多余的userlist/):
final routeProvider = Provider<GoRouter>((ref) => GoRouter( errorBuilder: (context, state) => const ErrorPage(), routes: <RouteBase>[ GoRoute( path: '/', pageBuilder: (context, state) => const MaterialPage(child: HomePage()), ), GoRoute( path: '/userlist', pageBuilder: (context, state) { return const MaterialPage(child: UserList()); }, routes: [ GoRoute( // 修正为:userId path: ':userId', pageBuilder: (context, state) { final userId = state.pathParameters['userId']; return MaterialPage(child: DetailsPage(userId: userId)); }), ]), ]));
2. 导航路径修正
在CustomListTile的onTap中,使用绝对路径(推荐,避免当前路由变化导致的路径错误):
onTap: () => context.go('/userlist/$userID'),
或者使用相对路径(仅当当前页面处于/userlist路由时可用):
onTap: () => context.go('$userID'),
3. 额外优化:避免用户查找抛出异常
在DetailsPage中,userList.firstWhere((user) => user.id == userId)如果找不到对应用户会直接抛出异常,建议使用firstWhereOrNull(需导入collection包):
// 先在pubspec.yaml添加依赖:collection: ^1.18.0 import 'package:collection/collection.dart'; // 修改getUserById方法 User? getUserById(String? userId) { return pageUserListProvider.when( data: (userList) { // 用firstWhereOrNull替代firstWhere,找不到时返回null return userList.firstWhereOrNull((user) => user.id == userId); }, loading: () => null, error: (error, stackTrace) => null, ); }
完成以上修改后,点击ListTile即可正确导航到DetailsPage并加载对应用户数据。
内容的提问来源于stack exchange,提问作者Gustavo Ramos
相关产品推荐
相关产品推荐

