Flutter 完成迭代循环后映射为空

Flutter 完成迭代循环后映射为空,flutter,dart,Flutter,Dart,我只需要在完成迭代循环之后打印地图的密钥计数 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

我只需要在完成迭代循环之后打印地图的密钥计数

 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;
  }
经过多次打印

put_key = xxx

要正确填写地图,您必须正确地等待您的未来。然而,填充一个映射然后返回null可能不是这个方法应该做的事情。这看起来更像是您正在寻找的:

Future<GazStation> getNearestGazStation() async {
    final gazStationList = await getGazStationList();
    final myPosition = await Geolocator().getCurrentPosition(desiredAccuracy: LocationAccuracy.high);

    GazStation closest = null;
    double closestDistance = double.maxFinite;

    for(var gazStation in gazStationList) {
      final distanceInMeters = await _getDistanceMetersToGazStation(myPosition, gazStation);

      if(distanceInMeters < closestDistance) {
         closestDistance = distanceInMeters;
         closest = gazStation;
      }
    }
    
    return closest;
  }
Future getNearestGazStation()异步{
最终gazStationList=等待getGazStationList();
final myPosition=Wait Geolocator().getCurrentPosition(期望精度:LocationAccurance.high);
GazStation=null;
double closestDistance=double.maxFinite;
用于(gazStationList中的var gazStation){
最终距离仪表=等待距离仪表至加气站(我的位置,加气站);
if(距离米<最近距离){
最近距离=以米为单位的距离;
最近=加油站;
}
}
返回最近的位置;
}

要正确填写地图,您必须正确地等待未来。然而,填充一个映射然后返回null可能不是这个方法应该做的事情。这看起来更像是您正在寻找的:

Future<GazStation> getNearestGazStation() async {
    final gazStationList = await getGazStationList();
    final myPosition = await Geolocator().getCurrentPosition(desiredAccuracy: LocationAccuracy.high);

    GazStation closest = null;
    double closestDistance = double.maxFinite;

    for(var gazStation in gazStationList) {
      final distanceInMeters = await _getDistanceMetersToGazStation(myPosition, gazStation);

      if(distanceInMeters < closestDistance) {
         closestDistance = distanceInMeters;
         closest = gazStation;
      }
    }
    
    return closest;
  }
Future getNearestGazStation()异步{
最终gazStationList=等待getGazStationList();
final myPosition=Wait Geolocator().getCurrentPosition(期望精度:LocationAccurance.high);
GazStation=null;
double closestDistance=double.maxFinite;
用于(gazStationList中的var gazStation){
最终距离仪表=等待距离仪表至加气站(我的位置,加气站);
if(距离米<最近距离){
最近距离=以米为单位的距离;
最近=加油站;
}
}
返回最近的位置;
}

你不会等待你的未来。如果你不等待你的方法完成,那么你将没有结果…@nvoigt他们使用了
所以它应该与
等待
等待相同,对吗?@dev aentgs No,
然后
等待
做两件完全不同的事情。第一件说当它完成时应该发生什么,另一件实际上是在等待它完成。@nvoigt谢谢。@nvoigt
等待
不“等待”在阻塞的意义上;
wait
只需设置一个
。然后
自动回调(和
.catchError
。当完成
回调时,如果
等待
中执行
尝试
阻塞,分别使用
catch
最后
块)。你不会等待你的未来。如果你不等待你的方法完成,那么你将不会有结果…@nvoigt他们使用了
。然后(
所以它应该与
等待
等待相同,对吗?@dev aentgs No,
然后
等待
做两件完全不同的事情。第一件说当它完成时应该发生什么,另一件实际上是在等待它完成。@nvoigt谢谢。@nvoigt
等待
不“等待”在阻塞的意义上;
wait
只需设置一个
。然后
自动回调(和
.catchError
。当完成
回调时,如果
等待
中执行
尝试
阻塞,分别使用
catch
最后
块).I get error:error:“await”只能用于“async”或“async*”方法。final distanceInMeters=await\u GetDistanceMeters TogazStation(myPosition,gazStation);抱歉,我使用了“foreach”。但更改为“for(gazStationList中的var gazStation)”后问题消失了。谢谢。我得到错误:错误:“wait”只能用于“async”或“async*”方法。final distanceInMeters=wait\u getDistanceMetersToGazStation(我的位置,gazStation);很抱歉我使用了“foreach”。但是在更改为“for(gazStationList中的var gazStation)”后,问题消失了。谢谢。