Назад к вопросам
Junior
172
questionbank

В чем разница между Stateful и Stateless виджетами?

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech 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('Увеличить'),
        ),
      ],
    );
  }
}