Назад к вопросам
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('Увеличить'),
),
],
);
}
}