Yeimer
Yeimer

Reputation: 67

location in real time with flutter

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

Answers (1)

Julian2611
Julian2611

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

Related Questions