Dart中http.get获取的List数据无法返回至调用页面问题排查
故障点说明
问题核心是你没有等待异步任务执行完成,打印的是Future类型对象本身,而非异步任务返回的实际列表值。
- Dart中所有带
async标记的方法被调用时,会立刻返回一个封装了异步执行状态的Future对象,不会阻塞后续代码执行。只有使用await关键字等待Future完成,才能拿到它内部包裹的实际返回值。 - 你在
getRawData()方法中调用networking.getRawWeatherData()时没有加await,代码会直接执行后续的打印语句,此时网络请求、数据解析的流程还没跑完,rawData只是处于未完成状态的Future实例,打印出来自然不会是实际的列表内容。 Networking类内部的打印能输出正确数据,是因为这些打印语句写在await http.get(url)之后,会等网络请求返回、列表数据填充完成后才执行。
修正方案
在调用异步方法的位置添加await等待结果,同时给所在方法补充async标记:
Future<List<String>> getRawData() async { Networking networking = Networking(url: url); // 等待异步任务执行完成,拿到实际的列表结果 List<String> rawData = await networking.getRawWeatherData(); print("rawData in getRawData is $rawData"); return rawData; }
额外提一个现有代码的隐患:你把listOfUrls定义为Networking类的成员变量,如果多次调用同一个实例的getRawWeatherData()方法,新的uri会不断追加到旧列表里,出现重复数据。建议把列表定义在方法内部,每次调用生成独立的新列表,同时可以简化遍历逻辑:
Future<List<String>> getRawWeatherData() async { http.Response response = await http.get(url); Map data = convert.jsonDecode(response.body); data.remove("schema"); // 列表定义在方法内,避免状态污染 List<String> listOfUrls = []; for (var element in data["data"]) { listOfUrls.add(element["uri"]); } print("list in networking - $listOfUrls"); return listOfUrls; }
内容的提问来源于stack exchange,提问作者Chakra
相关产品推荐
相关产品推荐

