0
votes

Comment trier la liste des emplacements dans Flutter de Firestore?

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


0 commentaires

3 Réponses :


0
votes

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 .


0 commentaires

2
votes

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.


0 commentaires

0
votes

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


0 commentaires