Класс StatefulWidget
Класс StatefulWidget наследует
Widget
и объявляет createState.
Изменяемые поля хранят в
State,
а сам виджет остаётся неизменяемым. Обновление экрана
запускают через setState.
Синтаксис
class Counter extends StatefulWidget {
const Counter({super.key});
@override
State<Counter> createState() => _CounterState();
}
Параметры
| Параметр | Описание |
|---|---|
key |
Ключ виджета для идентификации в дереве. |
Методы
| Метод | Описание |
|---|---|
createState |
Вызывается один раз, когда элемент впервые попадает в дерево. Давайте разберём вызов на примерах. |
Пример
Давайте объявим StatefulWidget со счётчиком:
import 'package:flutter/material.dart';
void main()
{
runApp(
MaterialApp(
home: Scaffold(
body: Center(
child: Counter(),
),
),
),
);
}
class Counter extends StatefulWidget
{
const Counter({super.key});
@override
State<Counter> createState() => _CounterState();
}
class _CounterState extends State<Counter>
{
int value = 0;
@override
Widget build(BuildContext context)
{
return Column(
mainAxisSize: MainAxisSize.min,
children: [
Text('$value'),
ElevatedButton(
onPressed: () => setState(() => value++),
child: const Text('abcde'),
),
],
);
}
}
На экране число и кнопка 'abcde';
по нажатию счётчик растёт.
Пример
Давайте передадим начальное значение через параметр виджета:
import 'package:flutter/material.dart';
void main()
{
runApp(
MaterialApp(
home: Scaffold(
body: Center(
child: Counter(start: 5),
),
),
),
);
}
class Counter extends StatefulWidget
{
const Counter({super.key, this.start = 0});
final int start;
@override
State<Counter> createState() => _CounterState();
}
class _CounterState extends State<Counter>
{
late int value;
@override
void initState()
{
super.initState();
value = widget.start;
}
@override
Widget build(BuildContext context)
{
return Text('$value');
}
}
На экране сразу покажется число 5 из параметра start.
Смотрите также
-
метод
createState,
который создаётState -
класс
State,
который хранит данные между кадрами -
класс
StatelessWidget,
который обходится безState -
виджет
StatefulBuilder,
который даётsetStateбез отдельного класса