【发布时间】:2020-07-21 14:59:40
【问题描述】:
我只需要在完成迭代循环后打印地图的键数。
import 'dart:collection';
import 'dart:convert';
import 'dart:ffi';
import 'package:flutter/services.dart';
import 'package:flutter_sample/model/GazStation.dart';
import 'package:flutter_sample/util/util.dart';
import 'package:geolocator/geolocator.dart';
import 'package:logger/logger.dart';
Future<GazStation> getNearestGazStation() async {
List<GazStation> gazStationList = await getGazStationList();
Position myPosition = await Geolocator()
.getCurrentPosition(desiredAccuracy: LocationAccuracy.high);
Map<double, GazStation> map = new HashMap();
gazStationList.forEach((gazStation) {
_getDistanceMetersToGazStation(myPosition, gazStation).then((distanceInMeters) {
_logger.d("put_key = ${distanceInMeters}");
map.putIfAbsent(distanceInMeters, () => gazStation);
});
});
_logger.d("map_keys_count = ${map.keys.length}");
return null;
}
Future<double> _getDistanceMetersToGazStation(Position myPosition, GazStation gazStation) async {
var distance = Geolocator().distanceBetween(
myPosition.latitude,
double.parse(gazStation.Latitude),
myPosition.longitude,
double.parse(gazStation.Longitude));
return distance;
}
但在日志中先打印:
map_keys_count = 0
多次打印后
put_key = xxx
【问题讨论】:
-
你不会等待你的未来。如果你不等待你的方法完成,那么你将没有结果......
-
@nvoigt 他们使用了
.then(,所以它应该和awaiting 一样吧? -
@dev-aentgs 不,
then和await做了两件非常不同的事情。第一个说完成后应该发生什么,另一个实际上是等待直到它完成。 -
@nvoigt 谢谢。
-
@nvoigt
await不会在阻塞的意义上“等待”;await只是自动设置了一个.then回调(如果awaited 在try块中分别带有catch或finally块,则.catchError和.whenComplete回调)。