Я разрабатываю приложение Flutter, которое требует отслеживания местоположения в режиме реального времени. Моя цель — постоянно отслеживать и обновлять местоположение пользователя в режиме реального времени. Однако я столкнулся с некоторыми проблемами и нуждаюсь в руководстве о том, как правильно это реализовать.
Описание проблемы: Непоследовательные обновления местоположения. Я использую пакет местоположения для получения координат пользователя и пакет геолокатора для геокодирования. Иногда обновления местоположения непоследовательны, со значительными задержками или неточностями. Высокое потребление батареи. Постоянное отслеживание местоположения быстро разряжает батарею. Я ищу способы оптимизировать использование батареи, сохраняя при этом точное отслеживание в реальном времени. Лучшие практики и оптимизация. Я хочу убедиться, что следую лучшим практикам отслеживания местоположения в режиме реального времени во Flutter. Существуют ли конкретные методы или конфигурации, которые могут повысить точность и эффективность обновлений местоположения?
import 'package:flutter/material.dart';
import 'package:location/location.dart';
import 'package:geolocator/geolocator.dart';
class LocationPage extends StatefulWidget {
@override
_LocationPageState createState() => _LocationPageState();
}
class _LocationPageState extends State<LocationPage> {
Location location = new Location();
late LocationData _currentPosition;
String _currentAddress = "";
@override
void initState() {
super.initState();
_getLocation();
}
_getLocation() async {
bool _serviceEnabled;
PermissionStatus _permissionGranted;
_serviceEnabled = await location.serviceEnabled();
if (!_serviceEnabled) {
_serviceEnabled = await location.requestService();
if (!_serviceEnabled) {
return;
}
}
_permissionGranted = await location.hasPermission();
if (_permissionGranted == PermissionStatus.denied) {
_permissionGranted = await location.requestPermission();
if (_permissionGranted != PermissionStatus.granted) {
return;
}
}
location.onLocationChanged.listen((LocationData currentLocation) {
setState(() {
_currentPosition = currentLocation;
_getAddressFromLatLng(_currentPosition.latitude, _currentPosition.longitude);
});
});
}
_getAddressFromLatLng(double? lat, double? lng) async {
try {
List<Placemark> placemarks = await placemarkFromCoordinates(lat!, lng!);
Placemark place = placemarks[0];
setState(() {
_currentAddress = "${place.locality}, ${place.postalCode}, ${place.country}";
});
} catch (e) {
print(e);
}
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text("Location Example"),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
if (_currentPosition != null)
Text(
"Latitude: ${_currentPosition.latitude}, Longitude: ${_currentPosition.longitude}",
),
if (_currentAddress != "")
Text(
"Address: $_currentAddress",
),
ElevatedButton(
onPressed: () {
_getLocation();
},
child: Text("Get Location"),
),
],
),
),
);
}
}