在 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循环,变量dist
是Future<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 完成时,然后 运行 函数。
我的目标是根据用户的地理位置对机架列表进行排序。这是我的代码:
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循环,变量dist
是Future<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 完成时,然后 运行 函数。