Luffy
Luffy

Reputation: 23

my flutter app is not taking location in real device at first time but work properly in emulator?

This code is working fine in emulator but it doesn't work properly in real device . This code for taking user location but when i open 1st time app it only ask permission for location and doesn't getlocation if restart my application then it take location.

@override
  void initState() {
    // TODO: implement initState
    super.initState();
    showAddress(context);
    didChangeDependencies();
  }

  Future showAddress(BuildContext context) async {
    await locationService();
  }

  void getYourAddress() {
    homeServices.addAddress(
      context: context,
      address: address,
      latitude: lat!,
      logitude: long!,
      locality: locality,
    );
  }

  double? lat;

  double? long;

  String address = '';
  String locality = '';

//For convert lat long to address
  getAddress(lat, long) async {
    List<geocoding.Placemark> placemarks =
        await geocoding.placemarkFromCoordinates(lat, long);
    if (mounted) {
      setState(() {
        address =
            "${placemarks[0].street!} ${placemarks[0].subLocality!} ${placemarks[0].locality!} ${placemarks[0].postalCode!} ${placemarks[0].country!} ";
        if (placemarks[0].locality == '') {
          locality = placemarks[0].street!;
        } else {
          locality = placemarks[0].locality!;
        }
      });
    }

    for (int i = 0; i < placemarks.length; i++) {
      print("INDEX $i ${placemarks[i]}");
    }
    getYourAddress();
  }

  Future locationService() async {
    Location location = Location();

    bool serviceEnabled;
    PermissionStatus permissionLocation;
    LocationData locData;

    serviceEnabled = await location.serviceEnabled();
    if (serviceEnabled == false) {
      serviceEnabled = await location.requestService();
      if (serviceEnabled == true) {
        permissionLocation = await location.hasPermission();
        if (permissionLocation == PermissionStatus.denied) {
          permissionLocation = await location.requestPermission();
          if (permissionLocation != PermissionStatus.granted) {
            Navigator.push(
              context,
              MaterialPageRoute(
                builder: (_) => const IntroScreen(),
              ),
            );
          } else if (permissionLocation == PermissionStatus.granted) {
            await getLocation();
          }
        } else if (permissionLocation == PermissionStatus.granted) {
          await getLocation();
        }
      }
    } else if (serviceEnabled == true) {
      permissionLocation = await location.hasPermission();
      if (permissionLocation == PermissionStatus.denied) {
        permissionLocation = await location.requestPermission();
        if (permissionLocation != PermissionStatus.granted) {
          Navigator.push(
            context,
            MaterialPageRoute(
              builder: (_) => const IntroScreen(),
            ),
          );
        } else if (permissionLocation == PermissionStatus.granted) {
          await getLocation();
        }
      } else if (permissionLocation == PermissionStatus.granted) {
        await getLocation();
      }
    } else {
      Navigator.push(
        context,
        MaterialPageRoute(
          builder: (_) => const IntroScreen(),
        ),
      );
    }
  }


// Problem occuring at this point in emulator it work fine but not work in real device.
  getLocation() async {
    try {
      LocationData locData;
      Location location = Location();

      locData = await location.getLocation();

      if (mounted) {
        setState(() {
          lat = locData.latitude!;
          long = locData.longitude!;
        });
        await getAddress(lat, long);
      }
    } catch (e) {
      getLocation();
    }
  }

I am expecting this app to ask user for location permission and store data imidiately to database. But it doesn't doing it on first time after i restart app then it take location . Please help me to solve this problem. I am use Using Location and Gecoding widget of flutter. when i try ti= check logs of my app in real device it show that asynchronous suspension.

Upvotes: 2

Views: 324

Answers (0)

Related Questions