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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 22:10:25