handleControllerOperation function

void handleControllerOperation({
  1. required BuildContext context,
  2. required dynamic operation(),
  3. required String successMessage,
})

Funzione helper generica per gestire operazioni asincrone della UI che coinvolgono un controller e mostrano feedback (SnackBar, navigazione).

Mostra una SnackBar di successo se l'operazione va a buon fine. In caso di errore, mostra una SnackBar di errore con il messaggio estratto dall'eccezione. Dopo il successo, attende 2 secondi e chiude la schermata corrente.

Parametri:

  • context: Il contesto di build corrente.
  • operation: La funzione asincrona da eseguire (ad esempio aggiunta, modifica, cancellazione).
  • successMessage: Il messaggio da mostrare nella SnackBar in caso di successo.

Implementation

void handleControllerOperation({
  required BuildContext context,
  // Funzione eseguita dal controller
  required dynamic Function() operation,
  required String successMessage,
}) async {
  // Verifico che il BuildContext sia valido

  try {
    final avviso = await operation(); // Eseguo l'operazione asincrona del controller

    if (!context.mounted) return ;

    if(avviso != null) {
      // Se l'operazione ha restituito un avviso, lo mostro in un AlertDialog
      await showDialog(
        context: context,
        builder: (context) => AlertDialog(
          title: const Text('Avviso'),
          content: Text(avviso),
          actions: [
            TextButton(
              onPressed: () => Navigator.of(context).pop(),
              child: const Text('OK'),
            ),
          ],
        ),
      );
    }

    if (!context.mounted) return ;

    // Se l'operazione ha successo, mostro la SnackBar di successo
    ScaffoldMessenger.of(context).showSnackBar(
      SnackBar(
        content: Text(successMessage),
        backgroundColor: Theme.of(context).colorScheme.primary,
        duration: const Duration(seconds: 2),
      ),
    );

  } catch (e) {
    // In caso di errore, estraggo il messaggio e lo mostro in una SnackBar di errore
    String errorMessage = e.toString();
    const prefix = 'Exception: ';
    if (errorMessage.startsWith(prefix)) {
      // Rimuovo il prefisso "Exception: " dal messaggio di errore
      errorMessage = errorMessage.substring(prefix.length);
    }

    // Controllo `mounted` prima di mostrare la SnackBar di errore
    if (!context.mounted) return ;

    ScaffoldMessenger.of(context).showSnackBar(
      SnackBar(
        content: Text(errorMessage),
        backgroundColor: Theme.of(context).colorScheme.error,
      ),
    );
  }
}