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('მატება'),
        ),
      ],
    );
  }
}