Search code examples
flutterdartgeolocation

Unable to get user's location in Flutter


Please help, I cannot get the user's location: Imagine I have a widget like:

 Text('LAT: ${_currentPosition?.altitude ?? "na"}'),
            Text('LNG: ${_currentPosition?.longitude ?? "na"}'),
            Text('ADDRESS: ${_currentAddress ?? "na"}'),
            const SizedBox(height: 32),
            ElevatedButton(
              onPressed: _getCurrentPosition,
              child: const Text("Get Current Location"),

and the logic to get location through libraries:

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

    serviceEnabled = await Geolocator.isLocationServiceEnabled();
    if (!serviceEnabled) {
      ScaffoldMessenger.of(context).showSnackBar(const SnackBar(
          content: Text(
              'Location services are disabled. Please enable the services')));
      return false;
    }
    permission = await Geolocator.checkPermission();
    if (permission == LocationPermission.denied) {
      permission = await Geolocator.requestPermission();
      if (permission == LocationPermission.denied) {
        ScaffoldMessenger.of(context).showSnackBar(
            const SnackBar(content: Text('Location permissions are denied')));
        return false;
      }
    }
    if (permission == LocationPermission.deniedForever) {
      ScaffoldMessenger.of(context).showSnackBar(const SnackBar(
          content: Text(
              'Location permissions are permanently denied, we cannot request permissions.')));
      return false;
    }
    return true;
  }

  Future<void> _getCurrentPosition() async {
    final hasPermission = await _handleLocationPermission();

    if (!hasPermission) return;
    await Geolocator.getCurrentPosition(desiredAccuracy: LocationAccuracy.high)
        .then((Position position) {
      setState(() => _currentPosition = position);
      _getAddressFromLatLng(_currentPosition!);
    }).catchError((e) {
      debugPrint(e);
    });
  }

  Future<void> _getAddressFromLatLng(Position position) async {
    await placemarkFromCoordinates(position.latitude, position.longitude)
        .then((List<Placemark> placemarks) {
      Placemark place = placemarks[0];
      setState(() {
        _currentAddress =
            '${place.street}, ${place.subLocality}, ${place.subAdministrativeArea}, ${place.postalCode}';
      });
    }).catchError((e) {
      debugPrint(e);
    });
  }

which is inside a StatefulWidget. I am currently getting nothing from it and I do not understand, since I am exactly following this tutorial:

https://medium.com/@fernnandoptr/how-to-get-users-current-location-address-in-flutter-geolocator-geocoding-be563ad6f66a

----------EDIT-------------

I tried to implement this with location package:

Location location = Location();
late bool _serviceEnabled;
late PermissionStatus _permissionGranted;
late LocationData _locationData;
late double? fieldLatitude;
late double? fieldLogitude;

  @override
  void initState() {
    super.initState();

    getfieldlocation();
  }

  Future<void> getfieldlocation() async {
    _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;
      }
    }
    _locationData = await location.getLocation();
    setState(() {
       fieldLatitude = _locationData.latitude;
       fieldLogitude = _locationData.longitude;
      print(fieldLatitude);print(fieldLogitude);
    });
  }

but it gives me an error related with initialization variables "Field fieldLatitude has not been initialized"


Solution

  • I Understand your problem. In my project I am using https://pub.dev/packages/location package. Steps to be followed for getting location.

    Future<void> getfieldlocation() async {
        _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;
          }
        }
        _locationData = await location.getLocation();
        setState(() {
          fieldLatitude = _locationData.latitude;
          fieldLogitude = _locationData.longitude;
          print(fieldLatitude);print(fieldLogitude);
        });
      }
    

    I have called this in initstate() function which only calls at start. If you want to call it continuously Use setduration function.

    If it works don't forget to contribute,or if having any doubts give a reply. Have a Good Day : )