完成迭代循环后,映射为空 [英] Map is empty after finish iterate loop

查看:90
本文介绍了完成迭代循环后,映射为空的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我只需要在完成迭代循环后再打印地图的键计数即可。

I need only after finish iterate loop then print map's key count.

 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


推荐答案

要正确填写地图,您必须正确地等待。但是,填充地图然后无论如何都返回null可能不是此方法应该做的。看起来更像是您要寻找的东西:

To fill you map correctly, you have to await your futures properly. However, filling a map and then returning null anyway is probably not what this method should do. This looks more like it could be what you are looking for:

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;
  }

这篇关于完成迭代循环后,映射为空的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆