[英]Calculate distance between previous location and current location in Flutter
I use the plugin Geolocator
and I try to calculate the distance between my previous location and the current location.我使用插件
Geolocator
并尝试计算我以前的位置和当前位置之间的距离。 The only problem is that I don't know how to get the previous location.唯一的问题是我不知道如何获得以前的位置。 Is there any way to store it or to get it from
Geolocator
?有没有办法存储它或从
Geolocator
获取它? This functionality will help me to calculate the distance while I'm driving a car (at the moment I use iOS simulator feature to simulate a freeway drive).此功能将帮助我在开车时计算距离(目前我使用 iOS 模拟器功能来模拟高速公路行驶)。 Here is my code:
这是我的代码:
import 'package:geolocator/geolocator.dart';
import 'package:flutter/material.dart';
import 'dart:async';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Distance between Locations',
debugShowCheckedModeBanner: false,
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: LocationPage(),
);
}
}
class LocationPage extends StatefulWidget {
LocationPage({Key key}) : super(key: key);
@override
_LocationPageState createState() => _LocationPageState();
}
class _LocationPageState extends State<LocationPage> {
Position _currentPosition;
Position _previousPosition;
StreamSubscription<Position> _positionStream;
double _distance;
@override
void initState() {
super.initState();
_calculateDistance();
}
Future _calculateDistance() async {
_positionStream = Geolocator.getPositionStream(
distanceFilter: 10, desiredAccuracy: LocationAccuracy.high)
.listen((Position position) async {
if ((await Geolocator.isLocationServiceEnabled())) {
Geolocator.getCurrentPosition(desiredAccuracy: LocationAccuracy.high)
.then((Position position) {
setState(() {
_currentPosition = position;
_distance = Geolocator.distanceBetween(
51.9021777, // how to get the previous Latitude position ?
-0.5257026, // how to get the previous Longitude position ?
position.latitude,
position.longitude);
});
}).catchError((err) {
print(err);
});
} else {
print("GPS is off.");
showDialog(
context: context,
builder: (BuildContext context) {
return AlertDialog(
content: const Text('Make sure your GPS is on in Settings !'),
actions: <Widget>[
FlatButton(
child: Text('OK'),
onPressed: () {
Navigator.of(context, rootNavigator: true).pop();
})
],
);
});
}
});
}
@override
void dispose() {
super.dispose();
_positionStream.cancel();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Location Manager'),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text(
'Previous Latitude: ${_previousPosition?.latitude ?? '-'} \nPrevious Longitude: ${_previousPosition?.longitude ?? '-'}',
),
SizedBox(height: 50),
Text(
'Current Latitude: ${_currentPosition?.latitude ?? '-'} \nCurrent Longitude: ${_currentPosition?.longitude ?? '-'}',
),
SizedBox(height: 50),
Text(
'Distance: ${_distance != null ? _distance.toStringAsFixed(2) : 0} meters.')
],
),
),
);
}
}
Thanks for reading this !感谢您阅读本文!
I fixed my problem like this:我这样解决了我的问题:
class _LocationPageState extends State<LocationPage> {
Position _currentPosition;
Position _previousPosition;
StreamSubscription<Position> _positionStream;
double _totalDistance = 0;
List<Position> locations = List<Position>();
@override
void initState() {
super.initState();
_calculateDistance();
}
Future _calculateDistance() async {
_positionStream = Geolocator.getPositionStream(
distanceFilter: 10, desiredAccuracy: LocationAccuracy.high)
.listen((Position position) async {
if ((await Geolocator.isLocationServiceEnabled())) {
Geolocator.getCurrentPosition(desiredAccuracy: LocationAccuracy.high)
.then((Position position) {
setState(() {
_currentPosition = position;
locations.add(_currentPosition);
if (locations.length > 1) {
_previousPosition = locations.elementAt(locations.length - 2);
var _distanceBetweenLastTwoLocations = Geolocator.distanceBetween(
_previousPosition.latitude,
_previousPosition.longitude,
_currentPosition.latitude,
_currentPosition.longitude,
);
_totalDistance += _distanceBetweenLastTwoLocations;
print('Total Distance: $_totalDistance');
}
});
}).catchError((err) {
print(err);
});
} else {
print("GPS is off.");
showDialog(
context: context,
builder: (BuildContext context) {
return AlertDialog(
content: const Text('Make sure your GPS is on in Settings !'),
actions: <Widget>[
FlatButton(
child: Text('OK'),
onPressed: () {
Navigator.of(context, rootNavigator: true).pop();
})
],
);
});
}
});
}
@override
void dispose() {
super.dispose();
_positionStream.cancel();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Location Manager'),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text(
'Previous Latitude: ${_previousPosition?.latitude ?? '-'} \nPrevious Longitude: ${_previousPosition?.longitude ?? '-'}',
),
SizedBox(height: 50),
Text(
'Current Latitude: ${_currentPosition?.latitude ?? '-'} \nCurrent Longitude: ${_currentPosition?.longitude ?? '-'}',
),
SizedBox(height: 50),
Text(
'Distance: ${_totalDistance != null ? _totalDistance > 1000 ? (_totalDistance / 1000).toStringAsFixed(2) : _totalDistance.toStringAsFixed(2) : 0} ${_totalDistance != null ? _totalDistance > 1000 ? 'KM' : 'meters' : 0}')
],
),
),
);
}
}
Output:输出:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.