flutter: no se puede obtener la latitud y la longitud mientras se usa el paquete GeoLocator

CorePress2024-01-25  12

Estoy intentando utilizar 'GeoLocator' para recuperar datos de Latitude & Longitud. Sin embargo, ¿no puedes obtener ningún resultado?

También sería útil si alguien pudiera ayudarme a organizar el paquete 'geoLocator' como un servicio en un archivo dart separado.

Como se sugirió, intenté cambiar el código, pero todavía no puedo obtener la geolocalización. Además, cuando llamo a '_determinePosition()' obtengo "Instancia de 'Futuro' ".

import 'package:flutter/material.dart';
import 'package:geolocator/geolocator.dart';

class HomePage extends StatefulWidget {
  @override
  _HomePageState createState() => _HomePageState();
}

class _HomePageState extends State<HomePage> {
  //

  Future<Position> _determinePosition() async {
    bool serviceEnabled;
    LocationPermission permission;

    // Test if location services are enabled.
    serviceEnabled = await Geolocator.isLocationServiceEnabled();
    if (!serviceEnabled) {
      return Future.error('Location services are disabled.');
    }

    permission = await Geolocator.checkPermission();
    if (permission == LocationPermission.denied) {
      permission = await Geolocator.requestPermission();
      if (permission == LocationPermission.deniedForever) {
        // Permissions are denied forever, handle appropriately.
        return Future.error(
            'Location permissions are permanently denied, we cannot request permissions.');
      }

      if (permission == LocationPermission.denied) {
        return Future.error('Location permissions are denied');
      }
    }

    return await Geolocator.getCurrentPosition();
  }

  @override
  Widget build(BuildContext context) {
    // TESTIST IF PRINT CAN WORK HERE
    print(_determinePosition());
    return Scaffold(
      appBar: AppBar(
        title: Text("Location"),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            TextButton(
              child: Text("Get location"),
              onPressed: () {
                // PRINTING IN THE CONSOLE
                _determinePosition();
              },
            ),
          ],
        ),
      ),
    );
  }
}

¿Agregaste permisos relevantes tanto para Android como para iOS como se especifica en el documento?

-glavigno

28/03/2021 a las 9:20

Sí en el AndroidManifest.

-Nikash Deka

3 de abril de 2021 a las 9:51



------------------------------------

Intente agregar el permiso de Internet además de los permisos de ubicación según la documentación (https://pub.dev/packages/geolocator):

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />

Con respecto a obtener "instantancia de un futuro" en lugar del resultado, debes esperar la llamada a _determinatePosition() así:

onPressed: () async{
            // PRINTING IN THE CONSOLE
           await _determinePosition();
          },

ParaAl usar Geolocator como servicio, recomiendo usar una solución de inyección de dependencia como Provider (https://pub.dev/packages/provider) o GetIt (https://pub.dev/packages/get_it)



------------------------------------

Utilice la siguiente función que comprueba el permiso y devuelve la posición actual, por lo que antes de obtener la ubicación es importante comprobar si hemos requerido el permiso o no.

import 'package:geolocator/geolocator.dart';

/// Determine the current position of the device.
///
/// When the location services are not enabled or permissions
/// are denied the `Future` will return an error.
Future<Position> _determinePosition() async {
  bool serviceEnabled;
  LocationPermission permission;

  // Test if location services are enabled.
  serviceEnabled = await Geolocator.isLocationServiceEnabled();
  if (!serviceEnabled) {
    // Location services are not enabled don't continue
    // accessing the position and request users of the 
    // App to enable the location services.
    return Future.error('Location services are disabled.');
  }

  permission = await Geolocator.checkPermission();
  if (permission == LocationPermission.denied) {
      permission = await Geolocator.requestPermission();
    if (permission == LocationPermission.deniedForever) {
      // Permissions are denied forever, handle appropriately. 
      return Future.error(
        'Location permissions are permanently denied, we cannot request permissions.');
    } 

    if (permission == LocationPermission.denied) {
      // Permissions are denied, next time you could try
      // requesting permissions again (this is also where
      // Android's shouldShowRequestPermissionRationale 
      // returned true. According to Android guidelines
      // your App should show an explanatory UI now.
      return Future.error(
          'Location permissions are denied');
    }
  }

  // When we reach here, permissions are granted and we can
  // continue accessing the position of the device.
  return await Geolocator.getCurrentPosition();
}

2

Hola Jitesh, intenté cambiar el código como sugeriste, ¡pero aún así no se pudo recuperar ninguna ubicación en la consola!

-Nikash Deka

3 de abril de 2021 a las 20:22

Entonces, ¿después de agregar el permiso de ubicación, se está ejecutando?

- Jitesh Mohite

5 de abril de 2021 a las 10:30

Su guía para un futuro mejor - libreflare
Su guía para un futuro mejor - libreflare