Я напечатал totalTime в моей функции расстояния, и она выдает все значения DocumentSnapshot, полученные из вычисленной переменной расстояния, которую я создал в функции:
Performing hot restart...
Syncing files to device iPhone 11 Pro Max...
Restarted application in 1,761ms.
flutter: 5.631018616945024
flutter: 2.6736733762697478
flutter: 0.6686528422968158
flutter: 1.7422156404871896
flutter: 9.861003284651066
Но результат напечатан в моем etaText в ListView.builder метода построения возвращает только 9.861003284651066 (окончательный результат DocumentSnapshot). Когда я распечатываю 'time' (что равно 'totalTime') в функции расстояния, он возвращает:
flutter: 9.861003284651066
flutter: 9.861003284651066
flutter: 9.861003284651066
flutter: 9.861003284651066
flutter: 9.861003284651066
Если кто-то может объяснить, что я делаю здесь неправильно, я был бы очень признателен! Спасибо.
import 'dart:async';
import 'dart:math';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart';
import 'package:geolocator/geolocator.dart';
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:myApp/Cards/Store Card.dart';
class StoreList extends StatefulWidget {
@override
_StoreListState createState() => _StoreListState();
}
class _StoreListState extends State<StoreList> {
StreamSubscription<QuerySnapshot> subscription;
List storeList;
final CollectionReference collectionReference = Firestore.instance.collection('stores');
Geolocator geolocator = Geolocator();
bool sort = true;
double time;
Future getLocation() async {
var currentLocation;
try {
currentLocation = await geolocator.getCurrentPosition(
desiredAccuracy: LocationAccuracy.medium);
} catch (e) {
currentLocation = null;
}
return currentLocation;
}
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));
}
double distance(Position position, DocumentSnapshot snapshot) {
final double myPositionLat = position.latitude;
final double myPositionLong = position.longitude;
final double lat = snapshot.data['latitude'];
final double long = snapshot.data['longitude'];
double totalTime = calculateDistance(myPositionLat, myPositionLong, lat, long) / 8 * 5 * 60 / 35;
if(totalTime >= 40){
return totalTime;
} else setState(() {
time = totalTime;
});
print(totalTime);
return totalTime;
}
void sortDistance(){
subscription = collectionReference.snapshots().listen((data) async {
final location = await getLocation();
final documents = data.documents.where((snapshot) => distance(location, snapshot) <= 40).toList();
// documents.sort((a, b) {
// final distanceA = distance(location, a);
// final distanceB = distance(location, b);
// return distanceA.compareTo(distanceB);
// });
setState(() {
storeList = documents;
});
});
}
@override
void initState() {
super.initState();
sortDistance();
}
@override
void dispose() {
subscription?.cancel();
super.dispose();
}
@override
Widget build(BuildContext context) {
return storeList != null ?
ListView.builder(
itemCount: storeList.length,
itemBuilder: (context, index) {
print(time);
String imgPath = storeList[index].data['image'];
String storeTextPath = storeList[index].data['name'];
String locationNamePath = storeList[index].data['location'];
return StoreCard(
etaText: time,
locationText: locationNamePath,
storeText: storeTextPath,
assetImage: Image.network(imgPath),
function: (){},
);
})
: Center(child: CircularProgressIndicator());
}
}