在 Flutter 中将 Future<int> 转换为 int

Convert Future<int> to int in Flutter

我的目标是根据用户的地理位置对机架列表进行排序。这是我的代码:

import 'package:geolocator/geolocator.dart';
import 'rack.dart';
import 'dart:async';
class RackList {

  List<Rack> _racks;
  RackList(this._racks);
  get racks => _racks;

  factory RackList.fromJson(Map<String,dynamic> json){
    var list = json['racks'] as List;

    Future<int> calculateDistance(var element) async{
      var startLatitude=45.532;
      var startLongitude=9.12246;
      var endLatitude=element.latitude;
      var endLongitude=element.longitude;
      var dist = await Geolocator().distanceBetween(
          startLatitude,
          startLongitude,
          endLatitude,
          endLongitude);
      var distance=(dist/1000).round();
      return distance;
    }

    list = list.map((i) => Rack.fromJson(i)).toList();

      for (int i = 0; i < list.length; i++) {
        var dist =  calculateDistance(list[i]);
        print(dist); //prints Instance of 'Future<int>'
        list[i].distance=dist; //crash
    }

    list.sort((a, b) => a.distance.compareTo(b.distance));
    return RackList(list);
  }
}

问题出在for循环,变量distFuture<int>类型,不能赋值给list[i].distance。如何将该值转换为普通 int?

我试过@Nuts 的解决方案但是:

var distances = new List();
for (int i = 0; i < list.length; i++) {
      calculateDistance(list[i]).then((dist) {
        distances.add(dist);
        print(distances[i]); //print the correct distance
      });
    }
print("index 0 "+distances[0].toString()); //prints nothing

就像在 for-cycle 之外我丢失了 distances 列表中的所有值

import 'package:geolocator/geolocator.dart';
import 'rack.dart';
import 'dart:async';
class RackList {

  List<Rack> _racks;
  RackList(this._racks);
  get racks => _racks;

  factory RackList.fromJson(Map<String,dynamic> json){
    var list = json['racks'] as List;

     calculateDistance(var element) async{
      var startLatitude=45.532;
      var startLongitude=9.12246;
      var endLatitude=element.latitude;
      var endLongitude=element.longitude;
      var dist = await Geolocator().distanceBetween(
          startLatitude,
          startLongitude,
          endLatitude,
          endLongitude);
      int distance=(dist/1000).round();
      return distance;
    }

    list = list.map((i) => Rack.fromJson(i)).toList();

      for (int i = 0; i < list.length; i++) {
        calculateDistance(list[i]).then((dist){

        print("${dist}"); //prints Instance of 'Future<int>'
        list[i].distance=dist; //crash
      });
    }

    list.sort((a, b) => a.distance.compareTo(b.distance));
    return RackList(list);
  }
} 

还可以:

var dist =  await calculateDistance(list[i]);

它将等待 Future 变为 return int 值。

另一个解决方案是:

calculateDistance(list[i]).then((dist) {list[i].distance=dist;})

当 Future 完成时,然后 运行 函数。