Sobes.tech
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('Ավելացնել'),
        ),
      ],
    );
  }
}