[英]How to sort list of locations in flutter from Firestore?
我的 firebase firestore 数据库中有一个名为“bakeries”的集合,该集合中有一系列文档,每个文档都有一个地理点字段,我在其中输入了它们的纬度和经度。 为了访问它们并查看离用户最近的面包店,我创建了一个 ListView.builder。 但是,我正在尝试根据与用户当前位置相关的地理点对 BakeryList 进行排序,但它不起作用。 我试过这个:
bakeryList.sort((a, b){
return a['geopoint'].compareTo(myLocation);
});
但它不会返回最近的面包店。 任何想法将不胜感激!
final userLocation = Geolocator().getCurrentPosition(desiredAccuracy: LocationAccuracy.high);
StreamSubscription<QuerySnapshot> subscription;
List <DocumentSnapshot> bakeryList;
final Query collectionReference = Firestore.instance.collection(('bakeries'));
@override
void initState() {
super.initState();
final myLocation = Geolocator().getCurrentPosition(desiredAccuracy: LocationAccuracy.high);
subscription = collectionReference.snapshots().listen((data) {
setState(() {
bakeryList = data.documents;
});
});
}
@override
Widget build(BuildContext context) {
return bakeryList != null ?
ListView.builder(
itemCount: bakeryList.length,
itemBuilder: (context, index){
String imgPath = bakeryList[index].data['image'];
String bakeryTextPath = bakeryList[index].data['name'];
String locationNamePath = bakeryList[index].data['location name'];
GeoPoint geoPointPath = bakeryList[index].data['geopoint'];
final geolocation = Text('${geoPointPath.latitude}, ${geoPointPath.longitude}');
return BakeryCard(
etaText: '${geoPointPath.latitude}, ${geoPointPath.longitude}',
locationText: locationNamePath,
merchantText: bakeryTextPath,
assetImage: Image.network(imgPath),
function: (){});
})
: Center(child: CircularProgressIndicator(),
);
}
我认为您的问题在于您的排序功能:
bakeryList.sort((a, b){
return a['geocode'].compareTo(myLocation);
});
在这里,您只是将第一家面包店的位置与用户的位置进行比较。 我认为你真正想要的是:
bakeryList.sort((a, b){
return distance(a['geocode'], myLocation).compareTo(distance(b['geocode'], myLocation));
});
其中函数distance
为您提供两点之间的距离。
除了Diviloper 的回答,请使用以下功能按距离对项目进行排序:
double calculateDistance(lat1, lon1, lat2, lon2) {
var p = 0.017453292519943295;
var c = cos;
var a = 0.5 -
c((lat2 - lat1) * p) / 2 +
c(lat1 * p) * c(lat2 * p) * (1 - c((lon2 - lon1) * p)) / 2;
return 12742 * asin(sqrt(a));
}
这将确保准确的结果。
注意:导入以下
import 'dart:math' show cos, sqrt, asin;
抱歉,这不是您问题的直接答案,但您可能想尝试使用 GeoFlutterFire。 它针对此类数据进行了超级优化,获取最近位置的列表非常简单。 链接到包GeoFlutterFire 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.