Junior
Jaký je rozdíl mezi widgety s stavem a bez stavu?
sobes.tech AI
Odpověď od AI
-
StatelessWidget:
- Nem má žádný vnitřní stav, který by se mohl časem měnit.
- Parametry widgetu jsou nastaveny při jeho vytvoření a zůstávají neměnné po celou dobu jeho životního cyklu.
- Používá se pro zobrazování statických dat.
- Překreslení probíhá pouze při přestavbě rodičovského widgetu.
- Implementuje se metodou
build().
-
StatefulWidget:
- Má vnitřní stav (
State), který se může měnit v reakci na události (akce uživatele, síťové požadavky atd.). - Překreslení widgetu nastává při volání
setState(). - Používá se pro vytváření interaktivních prvků a zobrazování dynamických dat.
- Skládá se ze dvou částí: samotného
StatefulWidgeta s ním spojeného objektuState.
- Má vnitřní stav (
| Vlastnost | StatelessWidget | StatefulWidget |
|---|---|---|
| Stav | Nemá | Má měnitelný stav (State) |
| Překreslení | Při přestavbě rodičovského widgetu | Při volání setState() |
| Použití | Statická data, neinteraktivní prvky | Interaktivní prvky, dynamická data |
| Implementace | Pouze metoda build() |
createState() a metody životního cyklu v State |
// Příklad StatelessWidget
class MyStatelessWidget extends StatelessWidget {
final String text;
MyStatelessWidget({required this.text});
@override
Widget build(BuildContext context) {
return Text(text); // Jednoduše zobrazí předaný text
}
}
// Příklad StatefulWidget
class MyStatefulWidget extends StatefulWidget {
@override
_MyStatefulWidgetState createState() => _MyStatefulWidgetState();
}
class _MyStatefulWidgetState extends State<MyStatefulWidget> {
int _counter = 0; // Vnitřní stav
void _incrementCounter() {
setState(() {
// Změní stav a způsobí překreslení
_counter++;
});
}
@override
Widget build(BuildContext context) {
return Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text('Čítač:'),
Text('$_counter'),
ElevatedButton(
onPressed: _incrementCounter, // Volání metody při stisknutí
child: Text('Zvýšit'),
),
],
);
}
}