Flutter/Dart 取缓存发请求报Future转String类型错误
问题排查结果
报错触发的核心原因是类型不匹配:你直接把异步操作返回的Future<dynamic>对象当成String类型传给了请求参数。
具体错误点
你在类属性初始化时写的:
final _sessionIDController = ReadCache.getString(key: "cache");
ReadCache.getString是异步方法,返回值是Future,不会同步返回缓存里存储的字符串SessionID,必须通过await等待异步执行完成,才能拿到实际的字符串值。
你之前能正常在页面展示缓存值,是因为CacheManagerUtils.cacheTextBuilder组件内部已经封装了异步读取缓存、等待结果、刷新UI的完整逻辑,不需要你手动处理异步流程,但你自己写请求逻辑时没有处理异步等待,直接把Future对象塞进了请求参数Map里,而http.post要求body里的Map值为String类型,类型转换失败就抛出了该异常。
修复方案
- 删除State类中错误初始化的
_sessionIDController属性,不要在类属性初始化阶段直接调用异步取值方法 - 在
messageBoardReq异步方法内部,通过await读取缓存拿到真实的String类型SessionID,再组装请求参数 - 把请求body的Map类型声明为
Map<String, String>,从语法层面约束参数类型,避免后续出现同类类型错误
修复后的请求方法代码如下:
void messageBoardReq() async { // 等待异步读取缓存完成,拿到字符串类型的SessionID String sessionId = await ReadCache.getString(key: "cache"); var map = <String, String>{ "SessionID": sessionId, }; var res = await http.post( Uri.parse("http://192.168.1.8:8080/HongLeong/MENU_REQUEST.do"), body: map, ); final data = jsonDecode(res.body); print(data); }
内容的提问来源于stack exchange,提问作者JoshuaaMarkkNairr
相关产品推荐
相关产品推荐

