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

Flutter模拟器打开应用时Token过期,如何修改代码刷新Token?

Flutter Token过期自动刷新解决方案

针对你遇到的“Expired Token”问题,核心问题出在handleResponse方法的401状态码处理逻辑——当前代码仅尝试重新登录但未更新本地Token,也未重新发起原请求。以下是具体修改方案:

关键修改点

1. 扩展handleResponse方法参数

添加原请求的必要参数,用于Token刷新后重新发起请求:

// 修改方法签名,新增请求相关参数
Future handleResponse(Response response, String endPoint, {HttpMethod method = HttpMethod.GET, Map? request, bool? avoidTokenError}) async {
  if (!await isNetworkAvailable()) {
    throw errorInternetNotAvailable;
  }

  // 新增递归防护:如果已尝试过刷新,直接抛出错误避免无限循环
  if (response.statusCode == 401) {
    if (avoidTokenError == true) {
      throw TokenException('Token刷新失败,请重新登录');
    }

    if (userStore.isLoggedIn) {
      try {
        // 使用存储的账号密码发起登录请求刷新Token
        Map<String, dynamic> req = {
          'username': userStore.userEmail,
          'password': userStore.userPassword,
        };
        var loginResult = await authApi.logInApi(req);
        
        // 更新本地存储的Token(假设loginResult包含token字段,根据实际接口调整)
        userStore.token = loginResult['token'];
        // 若接口返回用户信息,可同步更新userStore的其他字段
        // userStore.userEmail = loginResult['email'];

        // 重新发起原请求
        Response newResponse = await buildHttpResponse(endPoint, method: method, request: request);
        // 递归处理新响应,标记avoidTokenError防止无限刷新
        return handleResponse(newResponse, endPoint, method: method, request: request, avoidTokenError: true);
      } catch (e) {
        throw TokenException(e.toString());
      }
    } else {
      throw '请登录后重试';
    }
  }

  // 原有成功/错误处理逻辑保持不变
  if (response.statusCode.isSuccessful()) {
    return jsonDecode(response.body);
  } else {
    try {
      var body = jsonDecode(response.body);
      throw parseHtmlString(body['message']);
    } on Exception catch (e) {
      log(e);
      throw errorSomethingWentWrong;
    }
  }
}

2. 修改buildHttpResponse的调用逻辑

在buildHttpResponse方法末尾,将原请求参数传递给handleResponse:

// 替换原return response;的逻辑
return handleResponse(response, endPoint, method: method, request: request);

修改后流程说明

  1. 当接口返回401(Token过期)时,先检查用户是否已登录
  2. 使用存储的账号密码调用登录接口获取新Token
  3. 更新本地userStore中的Token
  4. 重新发起之前失败的请求
  5. 若刷新Token失败(如密码错误),抛出错误引导用户重新登录

注意事项

  • 确保authApi.logInApi接口返回的数据包含有效Token,且字段名与代码中loginResult['token']一致
  • 若你的应用存储的是加密后的密码,需先解密再发起登录请求
  • 测试时可故意让Token过期,验证是否能自动刷新并正常加载页面

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 08:45:06