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
StatefulWidgetstesso e l'oggettoStateassociato.
- Possiede uno stato interno (
| 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'),
),
],
);
}
}