Splash screen nativa in Flutter con flutter_native_splash

Foto di Milad Fakurian su Unsplash

GuidePrincipiante30 min Flutter 3.x

Splash screen nativa in Flutter con flutter_native_splash

Quando l'utente tocca l'icona della tua app, passa qualche istante prima che Flutter sia pronto a disegnare il primo widget. In quel lasso di tempo il sistema operativo mostra una schermata di avvio: se non la configuri, sarà una noiosa pagina bianca (o nera).

In questo tutorial vedremo come usare il pacchetto flutter_native_splash per generare automaticamente una splash screen nativa su Android e iOS, con logo, colore di sfondo, variante per il tema scuro e supporto al nuovo formato richiesto da Android 12+.

Alla fine imparerai anche a tenere la splash visibile finché l'app non ha finito di caricare i dati iniziali, per una transizione davvero fluida.

Prerequisiti: Flutter installato e funzionante (flutter doctor senza errori) e un progetto già creato.

  1. 1

    Creare il progetto e aggiungere la dipendenza

    Partiamo da un progetto nuovo (oppure usa il tuo progetto esistente):

    flutter create splash_demo
    cd splash_demo
    

    Il pacchetto flutter_native_splash serve solo in fase di sviluppo, perché genera file nativi: va quindi aggiunto fra le dev_dependencies.

    Puoi farlo da terminale oppure modificando a mano il pubspec.yaml. Dopo l'aggiunta, esegui flutter pub get per scaricare il pacchetto.

    # da terminale
    flutter pub add dev:flutter_native_splash
    
    # equivale a scrivere nel pubspec.yaml:
    # dev_dependencies:
    #   flutter_test:
    #     sdk: flutter
    #   flutter_native_splash: ^2.4.0
    
    flutter pub get

    Risultato atteso

    Il comando termina senza errori e nel pubspec.yaml compare flutter_native_splash tra le dev_dependencies.

  2. 2

    Preparare l'immagine del logo

    La splash nativa non è un widget Flutter: è un'immagine statica mostrata dal sistema operativo. Serve quindi un file PNG con sfondo trasparente.

    Consigli pratici:

    • usa un PNG quadrato di almeno 1152x1152 px (verrà ridimensionato automaticamente per tutte le densità);
    • evita testo molto piccolo: su Android 12+ il logo viene ritagliato dentro un cerchio;
    • tieni il contenuto grafico al centro, lasciando un margine di sicurezza del 30% circa attorno.

    Crea la cartella assets/ nella radice del progetto e copiaci dentro il logo. Per questa splash non serve dichiarare l'asset nella sezione flutter: del pubspec: il pacchetto legge il file direttamente dal disco durante la generazione.

    splash_demo/
    ├── assets/
    │   ├── splash_logo.png        # logo per tema chiaro
    │   └── splash_logo_dark.png   # logo per tema scuro (opzionale)
    ├── lib/
    │   └── main.dart
    └── pubspec.yaml

    Risultato atteso

    La cartella assets contiene i PNG del logo pronti per essere usati.

  3. 3

    Configurare flutter_native_splash nel pubspec.yaml

    Aggiungi in fondo al pubspec.yaml (allo stesso livello di indentazione di flutter:, quindi a inizio riga) la sezione flutter_native_splash.

    Le chiavi principali:

    • color / color_dark: colore di sfondo per tema chiaro e scuro;
    • image / image_dark: il logo mostrato al centro;
    • android_12: sezione obbligatoria per Android 12 e versioni successive, che usa un formato diverso (icona circolare + colore di sfondo);
    • android e ios: abilitano la generazione per le due piattaforme.

    ⚠️ Attenzione all'indentazione: lo YAML usa due spazi e non tollera i tab.

    flutter_native_splash:
      color: "#ffffff"
      color_dark: "#121212"
    
      image: assets/splash_logo.png
      image_dark: assets/splash_logo_dark.png
    
      android: true
      ios: true
      web: false
    
      # Android 12+ richiede una configurazione dedicata
      android_12:
        image: assets/splash_logo.png
        image_dark: assets/splash_logo_dark.png
        color: "#ffffff"
        color_dark: "#121212"
        # dimensione consigliata dell'icona: 960x960 px entro un canvas 1152x1152
        icon_background_color: "#ffffff"
        icon_background_color_dark: "#121212"

    Risultato atteso

    Il pubspec.yaml contiene la sezione flutter_native_splash senza errori di indentazione.

  4. 4

    Generare la splash screen nativa

    Ora lanciamo il generatore: il pacchetto scriverà i file di risorse nativi (drawable, styles.xml su Android, LaunchScreen.storyboard e asset su iOS).

    Dopo la generazione non basta un hot reload: le risorse native vengono lette solo all'avvio dell'app, quindi devi chiudere e rilanciare con flutter run (meglio ancora dopo un flutter clean se vedi la vecchia splash).

    Ricorda: ogni volta che modifichi il colore o il logo nel pubspec devi rieseguire il comando di generazione.

    # genera i file nativi
    dart run flutter_native_splash:create
    
    # se usi un file di configurazione separato
    # dart run flutter_native_splash:create --path=splash.yaml
    
    # riavvio pulito
    flutter clean
    flutter pub get
    flutter run

    Risultato atteso

    All'avvio dell'app compare la splash con il tuo logo centrato sul colore scelto, al posto della schermata bianca.

  5. 5

    Mantenere la splash visibile durante il caricamento iniziale

    Di default la splash sparisce appena Flutter disegna il primo frame. Se la tua app deve caricare preferenze, token o dati remoti, l'utente vedrebbe uno sfarfallio o una schermata vuota.

    Il pacchetto mette a disposizione due metodi:

    • FlutterNativeSplash.preserve(widgetsBinding: ...) — blocca la rimozione automatica;
    • FlutterNativeSplash.remove() — la toglie quando sei pronto.

    Importante: tra preserve e remove non deve passare troppo tempo (massimo 2-3 secondi), altrimenti l'utente percepisce l'app come lenta. Aggiungi sempre un try/catch per evitare di restare bloccato sulla splash in caso di errore.

    import 'package:flutter/material.dart';
    import 'package:flutter_native_splash/flutter_native_splash.dart';
    
    Future<void> main() async {
      final binding = WidgetsFlutterBinding.ensureInitialized();
      // La splash resta visibile finché non chiamiamo remove()
      FlutterNativeSplash.preserve(widgetsBinding: binding);
    
      try {
        await _inizializzaApp();
      } catch (_) {
        // anche in caso di errore dobbiamo proseguire
      } finally {
        FlutterNativeSplash.remove();
      }
    
      runApp(const MyApp());
    }
    
    Future<void> _inizializzaApp() async {
      // simula il caricamento di preferenze, sessione, configurazioni...
      await Future<void>.delayed(const Duration(seconds: 2));
    }
    
    class MyApp extends StatelessWidget {
      const MyApp({super.key});
    
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          title: 'Splash Demo',
          theme: ThemeData(colorSchemeSeed: Colors.indigo),
          darkTheme: ThemeData.dark(useMaterial3: true),
          home: const HomePage(),
        );
      }
    }
    
    class HomePage extends StatelessWidget {
      const HomePage({super.key});
    
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          appBar: AppBar(title: const Text('Home')),
          body: const Center(child: Text('App pronta!')),
        );
      }
    }

    Risultato atteso

    La splash nativa resta visibile per circa 2 secondi, poi appare direttamente la HomePage senza schermate bianche intermedie.

  6. 6

    Verificare su tema chiaro/scuro e rimuovere la configurazione

    Ultimo passo: la verifica.

    1. Cambia il tema del dispositivo (Impostazioni → Display → Tema scuro) e riavvia l'app: devi vedere color_dark e image_dark.
    2. Su Android 12+ controlla che il logo non venga tagliato: se succede, riduci il contenuto grafico lasciando più margine trasparente.
    3. Su iOS, se la vecchia splash resta in cache, disinstalla l'app dal simulatore e reinstallala.

    Se vuoi tornare indietro, il pacchetto offre un comando che ripristina i file nativi originali: utile prima di cambiare completamente design o se la splash dà problemi di build.

    Buone pratiche finali

    • Non usare la splash nativa per mostrare pubblicità o messaggi: deve essere istantanea.
    • Mantieni la splash coerente con la prima schermata dell'app (stesso sfondo) per un effetto di continuità.
    • Versiona il pubspec.yaml: i file nativi generati si possono sempre ricreare con un comando.
    # ripristina i file nativi di default
    dart run flutter_native_splash:remove
    
    # build di verifica
    flutter build apk --debug
    flutter build ios --debug --no-codesign

    Risultato atteso

    La splash si adatta correttamente a tema chiaro e scuro su Android e iOS, e sai come annullare la configurazione in qualsiasi momento.

CondividiXLinkedInFacebookWhatsApp

Commenti (0)

Ancora nessun commento. Inizia tu!