permissionRequester.dart 2.42 KB
import 'package:flutter/cupertino.dart';
import 'package:permission_handler/permission_handler.dart';
import 'package:wow_english/common/permission/permissionRequestPage.dart';

/// 带隐私合规功能的权限检查及请求入口
/// 外部可通过此方法来进行权限的检查和请求,将自动跳转到`PermissionRequestPage`页面。
/// 传入 `Permission` 以及对应的(中文)权限名称 `permissionName`
/// permissionDesc:设备权限使用说明(描述)
/// isRequiredPermission:是否强制要求 如果为 `true`,则 "取消" 按钮将执行 "退出app" 的操作
/// return 如果有权限则返回 `Future<true>`
Future<bool> requestPermission(
    BuildContext context,
    Permission permission,
    String permissionName,
    String permissionDesc,
    {bool isRequiredPermission = false}) async {
  return requestPermissions(context, [permission], [permissionName], permissionDesc,
      isRequiredPermission: isRequiredPermission);
}


Future<bool> requestPermissions(
    BuildContext context,
    List<Permission> permissions,
    List<String> permissionNames,
    String permissionDesc,
    {bool isRequiredPermission = false}) async {

  // List<PermissionStatus> statuses = await Future.wait(
  //   permissions.map((permission) => permission.status),
  // );
  // bool allGranted = statuses.every((status) => status.isGranted);

  bool allGranted = await isPermissionsGranted(permissions);
  if (allGranted) {
    return true;
  } else {
    return await Navigator.of(context).push(PageRouteBuilder(
        opaque: false,
        pageBuilder: ((context, animation, secondaryAnimation) {
          return PermissionRequestPage(permissions, permissionNames, permissionDesc,
              isRequiredPermission: isRequiredPermission);
        })));
  }
}

///(实际请求前)判断权限数组是否都授予
Future<bool> isPermissionsGranted(List<Permission> permissions) async {
  // 使用 every 直接检查权限状态
  return await Future.wait(permissions.map((permission) async {
    return await permission.status.isGranted;
  })).then((statuses) => statuses.every((status) => status));
}

///请求权限
Future<MapEntry<Permission, PermissionStatus>?> requestPermissionsInner(List<Permission> permissionList) async {
  Map<Permission, PermissionStatus> statusesMap = await permissionList.request();
  for (var entry in statusesMap.entries) {
    if (!entry.value.isGranted) {
      return entry;
    }
  }
  return null;
}