Sobes.tech
Junior

Care este diferența dintre widget-urile Stateful și Stateless?

sobes.tech AI

Răspuns de la AI

  • StatelessWidget:

    • Nu are o stare internă care poate fi schimbată în timp.
    • Parametrii widget-ului sunt setați la crearea sa și rămân neschimbați pe tot parcursul ciclului său de viață.
    • Este folosit pentru afișarea datelor statice.
    • Re-revizuirea are loc doar atunci când se reconstruiește widget-ul părinte.
    • Este implementat prin metoda build().
  • StatefulWidget:

    • Are o stare internă (State) care poate fi schimbată ca răspuns la evenimente (acțiuni ale utilizatorului, solicitări de rețea etc.).
    • Re-revizuirea widget-ului are loc când se apelează setState().
    • Este folosit pentru crearea de elemente interactive și afișarea de date dinamice.
    • Este format din două părți: propriul StatefulWidget și obiectul State asociat.
Caracteristică StatelessWidget StatefulWidget
Stare Nu are Are o stare modificabilă (State)
Re-revizuire La reconstruirea widget-ului părinte La apelarea setState()
Utilizare Date statice, elemente neinteractice Elemente interactive, date dinamice
Implementare Doar metoda build() createState() și metodele ciclului de viață în State
// Exemplu de StatelessWidget
class MyStatelessWidget extends StatelessWidget {
  final String text;

  MyStatelessWidget({required this.text});

  @override
  Widget build(BuildContext context) {
    return Text(text); // Afișează doar textul transmis
  }
}
// Exemplu de StatefulWidget
class MyStatefulWidget extends StatefulWidget {
  @override
  _MyStatefulWidgetState createState() => _MyStatefulWidgetState();
}

class _MyStatefulWidgetState extends State<MyStatefulWidget> {
  int _counter = 0; // Stare internă

  void _incrementCounter() {
    setState(() {
      // Modifică starea și provoacă re-revizuirea
      _counter++;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Column(
      mainAxisAlignment: MainAxisAlignment.center,
      children: <Widget>[
        Text('Contor:'),
        Text('$_counter'),
        ElevatedButton(
          onPressed: _incrementCounter, // Apelarea metodei la apăsare
          child: Text('Crește'),
        ),
      ],
    );
  }
}