У меня есть dataMarket с именем, широтой и долготой. широта и долгота используются для расчета расстояния между пользователем и рынком.
Data.dart
class Market{
static List dataMarket = [
Data(
nameDest = 'Alfamart',
latitudeDest: -6.163891,
longitudeDest: 106.628915),
Data(
nameDest = 'Minis'
latitudeDest: -6.211269,
longitudeDest: 106.615574),
Data(
nameDest = 'Star Market'
latitudeDest: -6.223254,
longitudeDest: 106.703905),
Data(
nameDest = 'Allmark'
latitudeDest: -6.163891,
longitudeDest: 106.628915),
Data(
nameDest = 'Eig Store'
latitudeDest: -6.178293,
longitudeDest: 106.631862,),
];
}
class Data{
String nameDest;
var latitudeDest;
var longitudeDest;
Data({
this.nameDest
this.latitudeDest,
this.longitudeDest});
}
MyListMarket.dart
import 'package:example/Data.dart';
import 'package:flutter/material.dart';
import 'dart:async';
import 'dart:math' show cos, sqrt, asin;
import 'package:geolocator/geolocator.dart';
class _DeleteWidgetState extends State<DeleteWidget> {
var lastLatitude;
var lastLongitude;
final dataInstance = Market.dataMarket;
var newSortRange = [];
@override
void initState() {
super.initState();
//_initUserLocation();
}
Future<int> _initUserLocation() async {
try {
await Future.delayed(Duration(seconds: 1));
Position position = await Geolocator()
.getLastKnownPosition(desiredAccuracy: LocationAccuracy.best);
lastLatitude = position.latitude;
lastLongitude = position.longitude;
} catch (e) {
print("Permission Denied");
}
return 1;
}
@override
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: Color.fromRGBO(246, 246, 246, 1),
body: FutureBuilder(
future: _initUserLocation(),
builder: (BuildContext context, AsyncSnapshot snapshot) {
if (!snapshot.hasData) {
return CircularProgressIndicator();
}
if (lastLatitude == null || lastLongitude == null) {
for (int i = 0; i < dataInstance.length; i++) {
newSortRange.add(0.00);
}
} else {
for (int i = 0; i < dataInstance.length; i++) {
//calculating distance with lat1, lon1, lat2, lon2
var p = 0.017453292519943295;
var c = cos;
var a = 0.5 -
c((dataInstance[i].latitudeDest - lastLatitude) * p) / 2 +
c(lastLatitude * p) *
c(dataInstance[i].latitudeDest * p) *
(1 -
c((dataInstance[i].longitudeDest - lastLongitude) *
p)) /
2;
newSortRange.add(12742 * asin(sqrt(a)));
}
}
newSortRange.sort();
print(newSortRange);
return ListView.separated(
key: PageStorageKey<String>('aKey'),
physics: BouncingScrollPhysics(),
itemCount: newSortRange.length,
itemBuilder: (context, index) {
return Material(
color: Color.fromRGBO(251, 251, 251, 1),
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
ListTile(
trailing: Text(
newSortRange[index].toStringAsFixed(2) + "\nKM",
style: new TextStyle(
fontSize: 13,
),
textAlign: TextAlign.right,
),
),
],
),
);
},
separatorBuilder: (context, index) {
return Divider(
height: 0.0,
thickness: 0.7,
);
});
},
),
);
}
}
, но в этом коде не синхронизируются c данные между nameDest и вычислением расстояния. Как решить эту проблему?
может быть, я могу сохранить вычисленное расстояние в массиве данных newRange null?
class Market{
static List dataMarket = [
Data(
nameDest = 'Alfamart',
latitudeDest: -6.163891,
longitudeDest: 106.628915,
newRange: null),
Data(
nameDest = 'Minis'
latitudeDest: -6.211269,
longitudeDest: 106.615574,
newRange: null),
Data(
nameDest = 'Star Market'
latitudeDest: -6.223254,
longitudeDest: 106.703905,
newRange: null),
Data(
nameDest = 'Allmark'
latitudeDest: -6.163891,
longitudeDest: 106.628915,
newRange: null),
Data(
nameDest = 'Eig Store'
latitudeDest: -6.178293,
longitudeDest: 106.631862,
newRange: null),
];
}
class Data{
String nameDest;
var latitudeDest;
var longitudeDest;
var newRange;
Data({
this.nameDest
this.latitudeDest,
this.longitudeDest,
this.newRange});
}
, если можно сохранить вычисленное расстояние в newRange . так как я могу хранить данные в массиве? или есть другой способ синхронизировать данные об имени и расстоянии c?