Sobes.tech
Junior

Qual è la differenza tra widget con stato e senza stato?

sobes.tech AI

Risposta dell'AI

  • StatelessWidget:

    • Non ha uno stato interno che può cambiare nel tempo.
    • I parametri del widget vengono impostati al momento della creazione e rimangono invariati durante tutto il ciclo di vita.
    • Viene usato per mostrare dati statici.
    • La ridisegnatura avviene solo quando il widget genitore viene ricostruito.
    • È implementato tramite il metodo build().
  • StatefulWidget:

    • Possiede uno stato interno (State) che può cambiare in risposta a eventi (azioni dell'utente, richieste di rete, ecc.).
    • La ridisegnatura del widget avviene quando si chiama setState().
    • È usato per creare elementi interattivi e mostrare dati dinamici.
    • È composto da due parti: il StatefulWidget stesso e l'oggetto State associato.
Caratteristica StatelessWidget StatefulWidget
Stato Non ha stato Ha uno stato mutabile (State)
Ricostruzione Quando il widget genitore viene ricostruito Quando si chiama setState()
Uso Dati statici, elementi non interattivi Elementi interattivi, dati dinamici
Implementazione Solo il metodo build() createState() e metodi del ciclo di vita in State
// Esempio di StatelessWidget
class MyStatelessWidget extends StatelessWidget {
  final String text;

  MyStatelessWidget({required this.text});

  @override
  Widget build(BuildContext context) {
    return Text(text); // Mostra semplicemente il testo passato
  }
}
// Esempio di StatefulWidget
class MyStatefulWidget extends StatefulWidget {
  @override
  _MyStatefulWidgetState createState() => _MyStatefulWidgetState();
}

class _MyStatefulWidgetState extends State<MyStatefulWidget> {
  int _counter = 0; // Stato interno

  void _incrementCounter() {
    setState(() {
      // Cambia lo stato e provoca la ridisegnatura
      _counter++;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Column(
      mainAxisAlignment: MainAxisAlignment.center,
      children: <Widget>[
        Text('Contatore:'),
        Text('$_counter'),
        ElevatedButton(
          onPressed: _incrementCounter, // Chiamata al metodo al clic
          child: Text('Incrementa'),
        ),
      ],
    );
  }
}