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

使用go_router登录跳转后Flutter图片资源加载失败求助

问题分析与解决思路

1. 优先排查路由重定向循环问题

当前每个路由单独设置redirect的方式,很容易触发无限重定向循环——比如登录状态切换后,Home和Login路由的redirect会互相触发跳转,导致Router持续刷新,最终阻塞开发服务器。

修改方案:将重移至全局级别,替换单个路由的redirect

GoRouter routerGenerator(UserData userData) {
  return GoRouter(
    initialLocation: Routes.home,
    refreshListenable: userData,
    debugLogDiagnostics: true,
    // 全局统一处理重定向逻辑
    redirect: (state) {
      final loggedIn = userData.loggedIn;
      final currentLocation = state.location;

      // 未登录且不在登录页,跳转登录
      if (!loggedIn && currentLocation != Routes.login) {
        return Routes.login;
      }
      // 已登录且不在首页/根路径,跳转首页
      if (loggedIn && currentLocation != Routes.home && currentLocation != '/') {
        return Routes.home;
      }
      // 其他情况不触发重定向
      return null;
    },
    routes: [
      GoRoute(
        path: Routes.home,
        builder: (_, __) => BasicScreen(),
        // 移除单个路由的redirect
      ),
      GoRoute(
        path: Routes.login,
        builder: (_, __) => AnimLoginScreen(),
        // 移除单个路由的redirect
      ),
      GoRoute(path: '/', builder: (_, __) => BasicScreen())
    ],
  );
}

2. 优化图片加载方式

直接使用AssetImage可能在路由跳转后出现资源加载上下文异常,换成Image.asset(内部封装了更完善的缓存和错误处理逻辑):

class BasicScreen extends StatelessWidget {
  const BasicScreen({super.key});

  @override
  Widget build(BuildContext context) {
    return Container(
      child: Column(
        children: [
          Image.asset("assets/images/image1.png"),
          Image.asset("assets/images/image2.png"),
          Image.asset("assets/images/image3.png"),
        ],
      ),
    );
  }
}

同时确认pubspec.yaml中资源配置为目录形式(确保所有图片被正确打包):

assets:
  - assets/images/

3. 检查状态管理的通知逻辑

UserData作为refreshListenable,状态变化时必须调用notifyListeners(),否则Router无法感知登录状态更新,可能引发异常跳转:

class UserData extends ChangeNotifier {
  bool _loggedIn = false;
  bool get loggedIn => _loggedIn;

  void login() {
    _loggedIn = true;
    notifyListeners(); // 必须调用此方法通知Router刷新
  }

  void logout() {
    _loggedIn = false;
    notifyListeners();
  }
}

4. 规范登录后的跳转方式

登录成功后使用context.go()而非push类方法,避免Login页面留在路由栈中导致资源堆积:

// 在AnimLoginScreen的登录成功回调中
context.go(Routes.home);

5. 排查开发服务器挂起原因

  • 打开Flutter DevTools的Performance面板,查看CPU/内存占用,确认是否存在无限循环函数调用;
  • 尝试在Release模式下运行应用,排除开发模式调试逻辑的干扰;
  • 清理Flutter缓存(执行flutter clean后重新运行),避免缓存资源冲突。

内容的提问来源于stack exchange,提问作者vrwolf

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 03:30:48