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