Sobes.tech
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 StatefulWidget a s ním spojeného objektu State.
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'),
        ),
      ],
    );
  }
}