requestMultiple method

Future<Map<Permission, bool>> requestMultiple({
  1. required List<Permission> permissions,
  2. bool showRationaleDialog = true,
})

Implementation

Future<Map<Permission, bool>> requestMultiple({
  required List<Permission> permissions,
  bool showRationaleDialog = true,
}) async {
  Map<Permission, PermissionStatus> statuses = {};
  for (var permission in permissions) {
    statuses[permission] = await permission.status;
  }
  List<Permission> permissionsToRequest = permissions
      .where((permission) =>
          statuses[permission]?.isDenied == true ||
          statuses[permission]?.isRestricted == true)
      .toList();

  if (permissionsToRequest.isEmpty) {
    return Map.fromIterable(permissions, key: (p) => p, value: (_) => true);
  }

  if (showRationaleDialog && permissionsToRequest.length > 0) {
    bool userAccepted = await _showMultiplePermissionsDialog(
      permissions: permissionsToRequest,
    );

    if (!userAccepted) {
      return Map.fromIterable(permissions,
          key: (p) => p, value: (p) => statuses[p]?.isGranted == true);
    }
  }
  Map<Permission, PermissionStatus> results =
      await permissionsToRequest.request();
  return Map.fromIterable(permissions,
      key: (p) => p,
      value: (p) =>
          results[p]?.isGranted == true || statuses[p]?.isGranted == true);
}