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 obiectulStateasociat.
- Are o stare internă (
| 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'),
),
],
);
}
}