Reputation: 67
I am trying to capture the latitude and longitude in real time with my gps on my device however so far I am only getting the current longitude and latitude and it is not updating.
What I want to do is that when the gps detects that the latitude or longitude has changed, they are updated on the screen
additionally it is happening to me that when I start if I start the application and deny the permission the application breaks
For this exercise I am using geolocator: ^ 5.3.2 + 2 I appreciate your help enter image description here
Error enter image description here
import 'dart:async';
import 'package:flutter/material.dart';
import 'package:geolocator/geolocator.dart';
void main() => runApp(App());
class App extends StatefulWidget {
@override
_AppState createState() => _AppState();
}
class _AppState extends State<App> {
String _locationMessage = "";
Future disponiblidad() async {
var geoLocator = Geolocator();
var status = await geoLocator.checkGeolocationPermissionStatus();
if (status == GeolocationStatus.denied) {
//pedirpermiso();
// Llevar a la usuario a la configuración de permisos
print('Llevar a la usuario a la configuración de permisos');
} else if (status == GeolocationStatus.disabled) {
//AppSettings.openLocationSettings();
//Llevar a la usuario a la página de ubicación
print('Llevar a la usuario a la página de ubicación');
} else if (status == GeolocationStatus.restricted) {
// Restringida
print('Restringida');
} else if (status == GeolocationStatus.unknown) {
// Desconocida
print('Desconocida');
} else if (status == GeolocationStatus.granted) {
//Permiso otorgado y ubicación habilitada
print('Permiso otorgado');
location();
}
}
void pedirpermiso() async {
final position = await Geolocator()
.getCurrentPosition(desiredAccuracy: LocationAccuracy.high);
if (position == null) {}
}
void location() async {
var geolocator = Geolocator();
var locationOptions =
LocationOptions(accuracy: LocationAccuracy.high, distanceFilter: 10);
// ignore: unused_local_variable
// ignore: cancel_subscriptions
StreamSubscription<Position> positionStream = geolocator
.getPositionStream(locationOptions)
.listen((Position position) {
setState(() {
print(position == null
? 'Unknown'
: position.latitude.toString() +
', ' +
position.longitude.toString());
_locationMessage =
"${position.latitude.toString()}, ${position.longitude.toString()}";
//String hoa = positionStream;
});
});
}
@override
void initState() {
super.initState();
// _checkGps();
disponiblidad();
}
// This widget is the root of your application.
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
home: Scaffold(
appBar: AppBar(title: Text("Location Services")),
body: Align(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text(_locationMessage),
FlatButton(
onPressed: () {
// _getCurrentLocation();
},
color: Colors.green,
child: Text("Find Location"))
]),
)));
}
}
Upvotes: 0
Views: 4560
Reputation: 442
You may use a stream object for this purpose. The geolocator package offers such an api which continuesly listen for changes.
Here is one example:
import 'package:geolocator/geolocator.dart';
var geolocator = Geolocator();
var locationOptions = LocationOptions(accuracy: LocationAccuracy.high,
distanceFilter: 10);
StreamSubscription<Position> positionStream = geolocator
.getPositionStream(locationOptions)
.listen((Position position) {
print(position == null ? 'Unknown' : position.latitude.toString() + ', ' +
position.longitude.toString());
});
Using this in combination with a StreamBuilder widget (https://api.flutter.dev/flutter/widgets/StreamBuilder-class.html) you should be able to reflect any position updates to the ui.
Upvotes: 1