Sobes.tech
Junior

Kuo skiriasi Stateful ir Stateless widgetai?

sobes.tech AI

Atsakymas iš AI

  • StatelessWidget:

    • Neturi vidinės būsenos, kuri galėtų keistis laikui bėgant.
    • Vaidmens parametrai nustatomi jo sukūrimo metu ir lieka nepakitę viso jo gyvavimo ciklo metu.
    • Naudojamas statiniams duomenims rodyti.
    • Perbraukimas vyksta tik perkuriant tėvinį vaizdą.
    • Įgyvendinamas build() metodu.
  • StatefulWidget:

    • Turi vidinę būseną (State), kuri gali keistis reaguojant į įvykius (vartotojo veiksmus, tinklo užklausas ir kt.).
    • Perbraukimas vyksta iškvietus setState() metodą.
    • Naudojamas interaktyviems elementams ir dinamiškiems duomenims rodyti.
    • Susideda iš dviejų dalių: pačio StatefulWidget ir su juo susijusio State objekto.
Bruožas StatelessWidget StatefulWidget
Būklė Neturi Turi keičiamą būseną (State)
Perbraukimas Kai perstatomas tėvas Kai iškviečiamas setState()
Naudojimas Statiniai duomenys, neinteraktyvūs elementai Interaktyvūs elementai, dinamiški duomenys
Įgyvendinimas Tik build() metodas createState() ir gyvavimo ciklo metodai State objekte
// Pavyzdys StatelessWidget
class MyStatelessWidget extends StatelessWidget {
  final String text;

  MyStatelessWidget({required this.text});

  @override
  Widget build(BuildContext context) {
    return Text(text); // Paprastas rodyti perduotą tekstą
  }
}
// Pavyzdys StatefulWidget
class MyStatefulWidget extends StatefulWidget {
  @override
  _MyStatefulWidgetState createState() => _MyStatefulWidgetState();
}

class _MyStatefulWidgetState extends State<MyStatefulWidget> {
  int _counter = 0; // Vidinė būseną

  void _incrementCounter() {
    setState(() {
      // Būsenos keitimas ir perbraukimo iškvietimas
      _counter++;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Column(
      mainAxisAlignment: MainAxisAlignment.center,
      children: <Widget>[
        Text('Skaitiklis:'),
        Text('$_counter'),
        ElevatedButton(
          onPressed: _incrementCounter, // Metodas paspaudus
          child: Text('Padidinti'),
        ),
      ],
    );
  }
}