Flutter-拒绝后再询问位置权限

时间:2019-09-12 06:49:54

标签: flutter permissions geolocation location

我当前正在使用位置信息包来检索用户的当前位置。如果用户拒绝此请求,我希望以后可以在应用程序中需要它们的位置时重新请求这些权限。

initPlatformState() async {
    await _locationService.changeSettings(
        accuracy: LocationAccuracy.HIGH, interval: 1000);


  LocationData location;
    // Platform messages may fail, so we use a try/catch PlatformException.
    try {
      bool serviceStatus = await _locationService.serviceEnabled();
      print("Service status: $serviceStatus");
      if (serviceStatus) {
        _permission = await _locationService.requestPermission();
        print("Permission: $_permission");

        if (_permission) {
          location = await _locationService.getLocation();
        }
      } else {
        bool serviceStatusResult = await _locationService.requestService();
        print("Service status activated after request: $serviceStatusResult");
        if (serviceStatusResult) {
          initPlatformState();
        }
      }
    } on PlatformException catch (e) {
      print(e);
      if (e.code == 'PERMISSION_DENIED') {
        error = e.message;
        print(error);
      } else if (e.code == 'SERVICE_STATUS_ERROR') {
        error = e.message;
        print(error);
      }
      location = null;
    }

    setState(() {
      _currentLocation = location;
    });
  }

以上代码在应用程序的初始化状态下运行,并且始终在首次运行应用程序时执行。

在第一次运行时,如果显示许可权屏幕,则在许可权屏幕上一切正常,并根据需要检索位置。如果您拒绝该许可,则许可为“ false”,这与预期的一样。但是,如果您重新打开该应用程序,则它只会检索"Service Status: True"并停留在行

_permission = await _locationService.requestPermission();

,并且永远不会继续前进。我期望执行上述代码后,将重新出现“请分享您的位置”屏幕,但由于用户在首次启动时拒绝了它,因此它似乎不会重新出现。因此,在更改此应用程序之前,无法使用该应用程序。

是否有办法使此消息重新出现?还是我必须指示用户打开设置并启用位置权限?

1 个答案:

答案 0 :(得分:1)

您可以将initPlatformState()包装在initState的setState中

      @override
void initState() { 
  super.initState();
  setState(() {
     initPlatformState()
  });

}