solicitar method

Future<bool> solicitar({
  1. required OperacionPermiso operacionPermiso,
  2. required PermissionDialog onPermanentlyDenied,
})

Solicita los permisos requeridos para operacionPermiso.

El callback onPermanentlyDenied se invoca solo si existe al menos un permiso marcado como Permanently Denied. Devuelve true cuando todos los permisos están concedidos.

Implementation

Future<bool> solicitar({
  required OperacionPermiso operacionPermiso,
  required PermissionDialog onPermanentlyDenied,
}) async {
  if (kIsWeb || !Platform.isAndroid) return true;

  final sdk = await _sdkVersion();
  if (sdk < 23 || sdk >= 30) return true; // permisos en instalación o SAF

  final permisos = _permisosNecesarios(operacionPermiso);

  // Filtra los ya concedidos
  final pendientes = [
    for (final p in permisos)
      if (!(await p.status).isGranted) p,
  ];
  if (pendientes.isEmpty) return true;

  // Solicita los pendientes
  final res = await pendientes.request();

  // Permisos permanentemente denegados
  final denegados = res.entries
      .where((e) => e.value.isPermanentlyDenied)
      .map((e) => e.key)
      .toList();

  if (denegados.isNotEmpty) {
    final irAjustes = await onPermanentlyDenied(denegados);
    if (irAjustes) await openAppSettings();
    return false;
  }

  return res.values.every((s) => s.isGranted);
}