拒绝后的权限请求 flutter app

Permission request flutter app after denial

我正在开发一个 flutter 应用程序,我需要管理权限请求,但我不知道如何处理特定事件:

如果我通过弹出窗口两次拒绝相同的权限,以后可能无法批准它,因为弹出窗口不会再次出现。

Future<void> requestStoragePermission() async{
  var status = await Permission.storage.status;
  if(status.isPermanentlyDenied){
    await AppSettings.openAppSettings();
  } else {
    await Permission.storage.request();
  }
}

我不明白如何区分什么时候权限还没有被授予,什么时候被拒绝了几次,因为函数:Permission.storage.status总是returns“拒绝”。

****** 编辑 ******

当用户多次(2次)拒绝同一个权限时出现问题,因为不再显示权限请求弹窗,此时需要手动打开应用程序设置并手动修改权限。我必须确保:前两次我使用弹出窗口请求权限然后我应该打开设置屏幕

我一直使用两种状态 grantedlimited(仅用于 iOS14+)来管理我的权限。这两个权限是唯一真实的状态。其他都是假状态。

permission_handler 包已经为您处理了很多逻辑。在发出请求之前,它将检查状态以查看它是否已经定义。如果是,那么它将 return 状态。如果从未请求过权限,那么它将请求权限。

就个人而言,我为权限请求设置了一个通用方法,以保持干燥。

Future<bool> requestPermission(Permission setting) async {
  // setting.request() will return the status ALWAYS
  // if setting is already requested, it will return the status
  final _result = await setting.request();
  switch (_result) {
    case PermissionStatus.granted:
    case PermissionStatus.limited:
      return true;
    case PermissionStatus.denied:
    case PermissionStatus.restricted:
    case PermissionStatus.permanentlyDenied:
      return false;
  }
}

然后我提出这样的请求

final canUseStorage = await requestPermission(Permission.storage);

if (canUseStorage) {
  // do something with storage
}

如果您的 UI 依赖于 Permission 的状态,那么您仍然调用 Permission.storage.status

[编辑]
目前,您无法通过 permission_handler 跟踪请求弹出窗口显示了多少次。它只是 return 的状态。您需要根据 returned 状态值将用户带到设置。

旁注
而不是直接将用户带到设置中。也许你显示一个弹出窗口说“看起来我们没有权限......”,带有一个用户可以点击以转到设置的按钮,为用户提供一些关于为什么他们需要转到他们的上下文的上下文设置。而且这也是更好的用户体验!