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

Flutter中从Secure Storage获取Auth Token到请求头时类型错误求助

Flutter请求携带Auth Token报错的解决方法

问题原因

你遇到的Expected a value of type 'String', but got one of type '_Future'错误,核心原因是在getdata函数的请求头中,直接将await storage.read(key: "token")写入Map键值对。Map的初始化是同步操作,此处的await无法在Map构建阶段完成异步等待,导致传入Authorization字段的是未完成的Future对象,而非预期的Token字符串。

修正后的获取数据函数

先提前异步读取Token,再将其传入请求头:

getdata() async {
  final storage = FlutterSecureStorage();
  // 先异步读取Token,等待结果返回
  String? token = await storage.read(key: "token");
  Uri uri = Uri.parse("http://127.0.0.1:8000/api/account/countries");
  
  // 检查Token是否存在,避免空值报错
  if(token != null) {
    await http.get(uri, headers: {
      "Content-Type": "application/json",
      // 注意:多数API要求Authorization格式为 Bearer + Token,根据你的API要求调整
      "Authorization": "Bearer $token"
    });
  } else {
    // 处理Token不存在的情况,比如跳转登录页
    print("未获取到登录Token");
  }
}

优化登录函数(可选)

你的登录函数混用了await和.then(),统一使用await写法可提升代码可读性:

loginUser() async {
  final storage = FlutterSecureStorage();
  Uri uri = Uri.parse("http://127.0.0.1:8000/api/account/login");
  
  try {
    final response = await http.post(
      uri,
      headers: {"Content-Type": "application/json"},
      body: jsonEncode({
        "username": emailController.text,
        "password": passwordController.text
      })
    );
    
    if (response.statusCode == 200) {
      var data = json.decode(response.body);
      await storage.write(key: "token", value: data["token"]);
      print(data["token"]);
    } else {
      print(json.decode(response.body));
    }
  } catch(e) {
    // 处理网络请求异常
    print("登录请求失败:$e");
  }
}

额外注意事项

  • 多数后端API要求Authorization头的格式为Bearer <Token>,如果你的API有此要求,记得加上Bearer 前缀,否则可能出现鉴权失败。
  • 读取Token后必须做非空判断,避免因Token为空导致请求错误。
  • 建议将Token读取、请求头构建等逻辑封装成工具类,减少重复代码。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 11:24:17