местоположение в реальном времени с флаттером - PullRequest
0 голосов
/ 09 июля 2020

Я пытаюсь зафиксировать широту и долготу в реальном времени с помощью GPS на моем устройстве, однако пока я получаю только текущую долготу и широту, и они не обновляются.

Что я хочу сделать заключается в том, что когда GPS обнаруживает, что широта или долгота изменились, они обновляются на экране

, кроме того, со мной происходит, что когда я запускаю, если я запускаю приложение и отказываю в разрешении, приложение ломается

Для этого упражнения я использую геолокатор: ^ 5.3.2 + 2 Благодарю за вашу помощь введите здесь описание изображения

Ошибка введите описание изображения здесь

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"))
                  ]),
            )));
  }
}

1 Ответ

0 голосов
/ 09 июля 2020

Вы можете использовать для этой цели объект потока. Пакет geolocator предлагает такой API, который постоянно отслеживает изменения.

Вот один пример:

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());
});

Использование этого в сочетании с виджетом StreamBuilder (https://api.flutter.dev/flutter/widgets/StreamBuilder-class.html) вы должны иметь возможность отображать любые обновления позиции в пользовательском интерфейсе.

...