J'ai une collection dans ma base de données Firebase Firestore appelée «boulangeries» et à l'intérieur de la collection se trouve une série de documents, chacun avec un champ géopoint, où j'ai tapé leurs latitudes et longitudes. Pour y accéder et voir les boulangeries les plus proches des utilisateurs, j'ai créé un ListView.builder. Mais j'essaie de trier la liste de boulangerie par son géopoint par rapport à l'emplacement actuel de l'utilisateur et cela ne fonctionne pas. J'ai essayé ceci:
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(), ); }
Mais ce n'est pas rendre les boulangeries les plus proches. Toutes les idées seraient extrêmement appréciées!
bakeryList.sort((a, b){ return a['geopoint'].compareTo(myLocation); });
3 Réponses :
Désolé, ce n'est pas une réponse directe à votre question, mais vous voudrez peut-être essayer un GeoFlutterFire. Il est super optimisé pour fonctionner avec ce type de données, et obtenir une liste des emplacements les plus proches est très simple. Lien vers le package GeoFlutterFire .
Je pense que votre problème est dans votre fonction de tri:
bakeryList.sort((a, b){ return distance(a['geocode'], myLocation).compareTo(distance(b['geocode'], myLocation)); });
Ici, vous comparez simplement la position de la première boulangerie avec l'emplacement de l'utilisateur. Je pense que ce que vous voulez vraiment, c'est quelque chose comme:
bakeryList.sort((a, b){ return a['geocode'].compareTo(myLocation); });
où la fonction distance
vous donne la distance entre deux points.
En plus de la réponse de Diviloper , veuillez utiliser la fonction suivante pour trier les éléments en fonction de la distance:
import 'dart:math' show cos, sqrt, asin;
Cela garantira des résultats précis.
Remarque : importation suivant
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)); }