Junior
Aký je rozdiel medzi widgetmi Stateful a Stateless?
sobes.tech AI
Odpoveď od AI
-
StatelessWidget:
- Nemá vnútorný stav, ktorý sa môže meniť časom.
- Parametre widgetu sa nastavujú pri jeho vytvorení a zostávajú nezmenené počas celého jeho životného cyklu.
- Používa sa na zobrazovanie statických údajov.
- Prekreslenie nastáva iba pri prebudovaní rodičovského widgetu.
- Implementuje sa metódou
build().
-
StatefulWidget:
- Má vnútorný stav (
State), ktorý sa môže meniť ako odpoveď na udalosti (akcie používateľa, sieťové požiadavky atď.). - Prekreslenie widgetu nastáva pri volaní metódy
setState(). - Používa sa na vytváranie interaktívnych prvkov a zobrazovanie dynamických údajov.
- Skladá sa zo dvoch častí: samotného
StatefulWidgeta s ním prepojeného objektuState.
- Má vnútorný stav (
| Príznak | StatelessWidget | StatefulWidget |
|---|---|---|
| Stav | Nemá | Má meniteľný stav (State) |
| Prekreslenie | Pri prebudovaní rodiča | Pri volaní setState() |
| Použitie | Statické údaje, neinteraktívne prvky | Interaktívne prvky, dynamické údaje |
| Implementácia | Iba metóda build() |
createState() a metódy životného cyklu v State |
// Príklad StatelessWidget
class MyStatelessWidget extends StatelessWidget {
final String text;
MyStatelessWidget({required this.text});
@override
Widget build(BuildContext context) {
return Text(text); // Jednoducho zobrazuje odovzdaný text
}
}
// Príklad StatefulWidget
class MyStatefulWidget extends StatefulWidget {
@override
_MyStatefulWidgetState createState() => _MyStatefulWidgetState();
}
class _MyStatefulWidgetState extends State<MyStatefulWidget> {
int _counter = 0; // Vnútorný stav
void _incrementCounter() {
setState(() {
// Meniť stav a volať prekreslenie
_counter++;
});
}
@override
Widget build(BuildContext context) {
return Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text('Počítadlo:'),
Text('$_counter'),
ElevatedButton(
onPressed: _incrementCounter, // Metóda pri stlačení
child: Text('Zvýšiť'),
),
],
);
}
}