Expanded: cos'è e come funziona in Flutter

Autore: IT Sectr Pubblicato: 2026-07-03 Tempo di lettura: 6 min

Expanded è un widget Flutter che costringe un elemento figlio a riempire tutto lo spazio disponibile in un contenitore Flex. Quando Row o Column distribuiscono lo spazio tra i figli, Expanded prende lo spazio libero dopo aver considerato gli elementi non flessibili. Secondo la documentazione ufficiale di Flutter (2026), Expanded è uno dei widget di layout più utilizzati: viene applicato in interfacce percentuali, costruzione di carte, liste e pannelli. Il suo principale vantaggio è il calcolo automatico della larghezza o altezza basato sul coefficiente flex senza specificare esplicitamente le dimensioni.

Punti chiave

  • Expanded è un widget di layout che estende il figlio per riempire tutto lo spazio disponibile in Row, Column o Flex
  • Fattore flex determina la porzione di spazio libero che ogni Expanded riceve
  • Expanded differisce da Flexible in quanto riempie forzatamente tutto lo spazio disponibile
  • Stack non supporta Expanded, solo Row, Column e Flex
  • Errore nell'uso di Expanded al di fuori di un contenitore Flex causa una LayoutException

Cos'è Expanded

Expanded è un widget wrapper che prende un figlio e lo costringe ad espandersi per riempire lo spazio disponibile in un contenitore Flex (Row, Column, Flex). Expanded non ha una propria rappresentazione visiva — gestisce solo i vincoli (constraints) passati all'elemento figlio.

Al centro di Expanded c'è il meccanismo Flex fornito dal framework Flutter. Quando Row o Column calcolano le dimensioni dei loro figli, prima allocano spazio agli elementi non flessibili (widget regolari con dimensioni fisse), poi distribuiscono lo spazio rimanente tra i figli Expanded e Flexible proporzionalmente ai loro fattori flex.

Expanded utilizza Flexible.fit = FlexFit.tight. Ciò significa che il figlio di Expanded deve occupare tutto lo spazio allocato, anche se la sua dimensione propria è più piccola. A differenza di Flexible con Fit.loose, dove il figlio può essere più piccolo dell'area allocata, Expanded estende forzatamente il contenuto.

Riepilogo: Expanded è lo strumento principale per creare layout proporzionali in Flutter. Usalo quando hai bisogno che un elemento riempia garantitamente tutta la larghezza o altezza disponibile.

Expanded vs Flexible: differenze principali

Expanded e Flexible distribuiscono entrambi lo spazio nei contenitori Flex, ma si comportano in modo fondamentalmente diverso. La differenza sta nella proprietà fit, che determina se il figlio può essere più piccolo dello spazio disponibile.

Expanded ha un modello di comportamento rigoroso: il suo fit è uguale a FlexFit.tight. Ciò significa che il widget figlio riceve vincoli pari allo spazio disponibile — né più, né meno. Se il figlio è più piccolo, si allunga. Se è più grande, si restringe. Flexible utilizza FlexFit.loose, permettendo all'elemento figlio di avere qualsiasi dimensione all'interno dello spazio allocato.

In pratica: se una Row contiene due Expanded con flex=1, ciascuno occuperà esattamente metà della larghezza. Se li sostituisci con Flexible con fit.loose, ogni figlio può essere più piccolo della metà se la sua dimensione propria è minore — lo spazio rimanente rimane vuoto.

Riepilogo: usa Expanded per layout proporzionali rigorosi, Flexible quando il figlio può essere più piccolo dello spazio disponibile. Se non sei sicuro — inizia con Expanded, offre un comportamento più prevedibile.

Fattore flex: come viene distribuito lo spazio

Fattore flex (parametro flex) è un valore numerico che determina la porzione di spazio disponibile che un Expanded riceverà. Per impostazione predefinita flex=1, il che significa distribuzione uniforme tra tutti i figli Expanded.

L'algoritmo di distribuzione funziona in tre fasi. Prima: Flutter calcola la dimensione intrinseca di tutti i figli non flessibili. Seconda: lo spazio rimanente viene diviso per la somma di tutti i fattori flex. Terza: ogni Expanded riceve una parte uguale al suo fattore flex moltiplicato per la dimensione di un'unità flex.

Ad esempio, una Row larga 300px contiene due Expanded: il primo con flex=2, il secondo con flex=1. Lo spazio libero (300px meno i figli non flessibili) viene diviso in 3 parti. Il primo riceve 2/3, il secondo riceve 1/3. Se non ci sono figli non flessibili, il primo riceve 200px, il secondo riceve 100px.

Il fattore flex può essere qualsiasi numero intero positivo. Il valore 0 è un caso speciale: Expanded con flex=0 si comporta come un widget non flessibile regolare, occupando lo spazio minimo in base alla dimensione del figlio. Questo comportamento è equivalente all'assenza di Expanded.

Riepilogo: il fattore flex è la chiave per costruire layout flessibili. Usa proporzioni 1:1 per colonne uguali, 2:1 per pannelli con area principale e laterale, 3:1 per interfacce con navigazione stretta.

Esempi di codice con Expanded

Esempio 1 dimostra l'uso base di Expanded in Row per creare tre colonne uguali.

dart
Row(
  children: [
    Expanded(
      child: Container(
        color: Colors.red,
      ),
    ),
    Expanded(
      child: Container(
        color: Colors.green,
      ),
    ),
    Expanded(
      child: Container(
        color: Colors.blue,
      ),
    ),
  ],
)

In questo esempio, tre Expanded con flex=1 (predefinito) dividono equamente la larghezza della Row. I contenitori si estendono all'altezza totale impostata dalla Row e occupano parti uguali. Questo approccio è utile per creare layout basati su colonne con distribuzione proporzionale.

Esempio 2 mostra l'uso di diversi fattori flex per creare un layout con barra laterale e contenuto principale.

dart
Row(
  children: [
    Expanded(
      flex: 1,
      child: Container(
        color: Colors.grey.200,
        child: const Center(
          child: Text('Barra laterale'),
        ),
      ),
    ),
    Expanded(
      flex: 3,
      child: Container(
        color: Colors.white,
        child: const Center(
          child: Text('Area di contenuto'),
        ),
      ),
    ),
  ],
)

Il secondo esempio crea un layout tipico con una barra laterale (25%) e un'area di contenuto principale (75%). flex=1 e flex=3 danno un rapporto 1:3. Quando la larghezza dello schermo cambia, le proporzioni vengono preservate automaticamente — questa è la base delle interfacce adattive.

Riepilogo: Expanded con diversi fattori flex è uno strumento standard per costruire layout adattivi. La combinazione di Expanded in Column consente di creare disposizioni proporzionali sia orizzontali che verticali.

Errori comuni nell'uso di Expanded

Errore 1: usare Expanded al di fuori di Row, Column o Flex. Se posizioni Expanded direttamente in Stack, ListView o un altro contenitore non Flex, Flutter lancia una LayoutException con il messaggio "Expanded widgets must be placed inside Flex widgets". Soluzione: controlla il widget padre — solo Row, Column o Flex.

Errore 2: posizionare Expanded all'interno di ListView senza specificare shrinkWrap. ListView per impostazione predefinita ha altezza infinita nella direzione di scorrimento, e Expanded non può calcolare la sua parte. Soluzione: usa shrinkWrap: true o avvolgi la ListView in un SizedBox con altezza fissa.

Errore 3: più Expanded con flex totale che supera lo spazio disponibile. Se una Row con larghezza limitata contiene Expanded oltre a widget con grande dimensione intrinseca, può verificarsi overflow. Soluzione: controlla le dimensioni minime dei figli non flessibili e usa FittedBox o Flex fit se necessario.

Errore 4: Expanded annidati in Column dentro Row. Se un Expanded all'interno di una Column contiene un altro Expanded all'interno di una Row, può sorgere un conflitto di vincoli. Soluzione: limita la profondità di annidamento o usa ConstrainedBox per impostare esplicitamente le dimensioni a livelli intermedi.

Riepilogo: Expanded richiede il contesto padre corretto. Controlla sempre che Expanded sia posizionato direttamente in Row, Column o Flex, ed evita annidamenti senza dimensioni esplicite.

Domande frequenti

In cosa Expanded differisce da SizedBox.expand?

SizedBox.expand estende forzatamente il figlio alle dimensioni impostate dai vincoli esterni, ma non partecipa alla distribuzione flex. Expanded funziona solo all'interno di contenitori Flex e tiene conto del fattore flex nella distribuzione dello spazio libero tra i figli.

Si può usare Expanded all'interno di Stack?

No. Stack non è un contenitore Flex, e usare Expanded al suo interno causerà una LayoutException. Per estendere i figli in Stack, usa Positioned.fill o BoxConstraints.expand.

Cosa succede se non si specifica il fattore flex?

Per impostazione predefinita flex=1. Tutti gli Expanded senza flex esplicito ricevono parti uguali dello spazio libero. Se una Row ha tre Expanded senza flex, ciascuno occupa esattamente un terzo dello spazio disponibile.

Come fare Expanded solo in larghezza ma non in altezza?

Posiziona Expanded in una Row per l'allungamento orizzontale. Per l'allungamento verticale usa Expanded all'interno di Column. Se devi limitare le dimensioni, avvolgi Expanded o il suo figlio in SizedBox.

Expanded funziona con Wrap o widget Flex?

Expanded funziona con Flex, inclusi Row e Column come sue sottoclassi. Wrap non è un contenitore Flex e non supporta Expanded. Per distribuire lo spazio in Wrap usa altri metodi, come RunAlignment.

Riepilogo

  • Expanded è un widget per estendere forzatamente un figlio per riempire tutto lo spazio disponibile in un contenitore Flex
  • Fattore flex determina la proporzione di distribuzione dello spazio libero tra più Expanded
  • Differenza da Flexible: Expanded usa tight fit (riempimento obbligatorio), Flexible usa loose fit (opzionale)
  • Errore nel posizionare Expanded al di fuori di Row, Column o Flex causa una LayoutException
  • Adattabilità: le proporzioni del layout vengono preservate automaticamente al variare delle dimensioni dello schermo
  • Raccomandazione: usa Expanded come strumento principale per layout di colonne e pannelli in Flutter

Svilupperemo un'applicazione mobile chiavi in mano

IT Sectr crea applicazioni iOS e Android per startup e aziende dal 2017. Ti consulteremo e ti proporremo la soluzione migliore.

Discuti il progetto

Leggi anche