【问题标题】:Map is empty after finish iterate loop完成迭代循环后地图为空
【发布时间】: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 不,thenawait 做了两件非常不同的事情。第一个说完成后应该发生什么,另一个实际上是等待直到它完成。
  • @nvoigt 谢谢。
  • @nvoigt await 不会在阻塞的意义上“等待”; await 只是自动设置了一个 .then 回调(如果 awaited 在 try 块中分别带有 catchfinally 块,则 .catchError.whenComplete 回调)。

标签: flutter dart


【解决方案1】:

要正确填写地图,您必须正确await 您的期货。但是,填充地图然后返回 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;
  }

【讨论】:

  • 我得到错误:错误:'await' 只能用于 'async' 或 'async*' 方法。 final distanceInMeters = await _getDistanceMetersToGazStation(myPosition, gazStation);
  • 对不起,我使用了“foreach”。但是在更改为“for(var gazStation in gazStationList)”后,问题就消失了。谢谢。
猜你喜欢
  • 2012-01-07
  • 1970-01-01
  • 2016-11-05
  • 2020-02-28
  • 1970-01-01
  • 1970-01-01
  • 2023-03-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多