Flutter调用http.get时无法访问result.body属性报错如何解决
问题描述
Flutter开发中使用http包发起网络请求时,无法访问返回结果的.body属性,即使执行print(result.body);语句也会触发错误,报错信息如下:
获取到的报错信息
原有问题代码:
String url = "https://jsonplaceholder.typicode.com/posts/1/comments"; var result = http.get(Uri.parse(url)); apiList = jsonDecode(result.body)
报错原因
http.get()是异步方法,返回值类型为Future<Response>。上述代码没有使用await等待异步请求执行完毕,此时变量result存的是未完成的Future对象,不是请求完成后返回的Response响应实例,本身不存在.body属性,直接访问就会触发报错。
修复方案
- 调用
http.get()时添加await关键字,等待请求执行完成,拿到真实的Response响应对象 - 包裹请求逻辑的函数必须添加
async关键字,标记为异步函数 - 拿到响应后先校验状态码,确认请求成功(状态码200)后再解析响应体,避免接口报错时触发解析异常
- 安卓端运行前,需要在
android/app/src/main/AndroidManifest.xml的<manifest>节点下添加网络权限,否则请求会被系统拦截:
<uses-permission android:name="android.permission.INTERNET" />
修复后的可正常运行代码:
// 顶部不要遗漏导包 import 'package:http/http.dart' as http; import 'dart:convert'; // 抽离独立的异步请求方法 Future<void> fetchCommentList() async { const String url = "https://jsonplaceholder.typicode.com/posts/1/comments"; // 等待请求完成,获取真实响应对象 final http.Response result = await http.get(Uri.parse(url)); if (result.statusCode == 200) { final apiList = jsonDecode(result.body); // 后续写数据赋值、UI刷新逻辑即可 print('请求成功,返回数据:$apiList'); } else { print('请求失败,状态码:${result.statusCode}'); } }
注意:如果是在StatefulWidget的
initState生命周期中触发请求,不要直接给initState方法加async,在initState内部调用上述异步方法即可。
内容的提问来源于stack exchange,提问作者Dima C
相关产品推荐
相关产品推荐

