Попытка отсортировать мой список карт по широте и долготе, которые я установил в качестве полей в Firestore, по местоположению пользователя во Flutter (по их широте и долготе). Кто-нибудь знает как это сделать? Мой код, указанный ниже в функции сортировки, изменил порядок моих карточек только в порядке убывания документов в моей базе данных:
import 'dart:async';
import 'package:geolocator/geolocator.dart';
import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart';
import 'package:swiftbee/Cards/Merchant Card.dart';
import 'package:cloud_firestore/cloud_firestore.dart';
class BakeryList extends StatefulWidget {
@override
_BakeryListState createState() => _BakeryListState();
}
class _BakeryListState extends State<BakeryList> {
StreamSubscription<QuerySnapshot> subscription;
List bakeryList;
final CollectionReference collectionReference = Firestore.instance.collection('bakeries');
Geolocator geolocator = Geolocator();
Position userLocation;
Future<Position> getLocation() async {
var currentLocation;
try {
currentLocation = await geolocator.getCurrentPosition(
desiredAccuracy: LocationAccuracy.best);
} catch (e) {
currentLocation = null;
}
return currentLocation;
}
@override
void initState() {
super.initState();
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 merchantTextPath = bakeryList[index].data['name'];
String locationNamePath = bakeryList[index].data['location'];
double latitudePath = bakeryList[index].data['latitude'];
double longitudePath = bakeryList[index].data['longitude'];
String geoPath = '$latitudePath, $longitudePath';
void distanceCalc() async {
userLocation = await getLocation();
final double myPositionLat = userLocation.latitude;
final double myPositionLong = userLocation.longitude;
final double Lat = bakeryList[index].data['latitude'];
final double Long = bakeryList[index].data['longitude'];
final DistanceInMetres = await Geolocator().distanceBetween(myPositionLat, myPositionLong, Lat, Long)/1000;
final Time = DistanceInMetres / 12 * 60;
bakeryList.sort((a, b){
return DistanceInMetres.toInt();
});
}
distanceCalc();
return BakeryCard(
etaText: '',
locationText: locationNamePath,
merchantText: bakeryTextPath,
assetImage: Image.network(imgPath),
function: (){});
})
: Center(child: CircularProgressIndicator(),
);
}
}