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
相关产品推荐
相关产品推荐

