Junior
Ի՞նչ է տարբերությունը Stateful և Stateless վիջեթների միջև։
sobes.tech AI
Պատասխան AI-ից
-
StatelessWidget:
- Ոչ ունի ներքին վիճակ, որը կարող է փոխվել ժամանակի ընթացքում:
- Վիդջետի պարամետրերը սահմանվում են նրա ստեղծման ժամանակ և մնում անփոփոխ ողջ կյանքի ընթացքում:
- Օգտագործվում է ստատիկ տվյալների ցուցադրման համար:
- Փոխնորդը տեղի է ունենում միայն երբ վերակառուցվում է ծնող վիդջետը:
- Реализуется методом
build().
-
StatefulWidget:
- Ունի ներքին վիճակ (
State), որը կարող է փոխվել իրադարձությունների (օգտագործողի գործողությունների, ցանցային հարցումների և այլն) պատասխանով: - Վիդջետի վերակառուցումը տեղի է ունենում
setState()մեթոդի կանչից հետո: - Օգտագործվում է ինտերակտիվ տարրեր և դինամիկ տվյալներ ցուցադրելու համար:
- Կազմված է երկու մասից՝
StatefulWidgetև նրա հետ կապվածStateօբյեկտից:
- Ունի ներքին վիճակ (
| Գծանշան | StatelessWidget | StatefulWidget |
|---|---|---|
| Վիճակ | Չունի | Ունի փոփոխական վիճակ (State) |
| Վերակառուցում | Երբ վերակառուցվում է ծնողը | Երբ կանչվում է setState() |
| Օգտագործում | Ստատիկ տվյալներ, ոչ ինտերակտիվ տարրեր | Ինտերակտիվ տարրեր, դինամիկ տվյալներ |
| Իրականացում | Միայն build() մեթոդը |
createState() և կյանքի ցիկլի մեթոդներ State-ում |
// Օրինակ StatelessWidget
class MyStatelessWidget extends StatelessWidget {
final String text;
MyStatelessWidget({required this.text});
@override
Widget build(BuildContext context) {
return Text(text); // Պարզապես ցուցադրում է փոխանցված տեքստը
}
}
// Օրինակ StatefulWidget
class MyStatefulWidget extends StatefulWidget {
@override
_MyStatefulWidgetState createState() => _MyStatefulWidgetState();
}
class _MyStatefulWidgetState extends State<MyStatefulWidget> {
int _counter = 0; // Ներքին վիճակ
void _incrementCounter() {
setState(() {
// Փոխում ենք վիճակը և կանչում վերականգնում
_counter++;
});
}
@override
Widget build(BuildContext context) {
return Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text('Հաշվիչ:'),
Text('$_counter'),
ElevatedButton(
onPressed: _incrementCounter, // մեթոդ սեղմելու ժամանակ
child: Text('Ավելացնել'),
),
],
);
}
}