Класс State
Класс State связан с
StatefulWidget
через widget и context.
Старт настраивают в
initState,
экран собирают в
build,
изменения фиксируют через
setState,
ресурсы освобождают в
dispose.
Синтаксис
class _MyState extends State<MyWidget> {
@override
Widget build(BuildContext context) {
return const SizedBox.shrink();
}
}
Методы
| Метод | Описание |
|---|---|
initState |
Запускается сразу после createState. Давайте разберём вызов на примерах. |
didChangeDependencies |
Срабатывает после initState и при каждом изменении наследуемых данных через dependOnInheritedWidgetOfExactType. Давайте разберём вызов на примерах. |
didUpdateWidget |
Когда конфигурация StatefulWidget заменена.
|
setState |
Принимает колбэк, где меняют поля State. Давайте разберём вызов на примерах.
|
build |
Принимает BuildContext и описывает UI с учётом полей State. Давайте разберём вызов на примерах.
|
deactivate |
Идёт перед dispose, когда элемент временно убирают из дерева. Давайте разберём вызов на примерах. |
dispose |
Вызывают один раз, когда элемент больше не вернут. Давайте разберём вызов на примерах. |
activate |
Срабатывает после deactivate, если тот же State вернули в дерево. Давайте разберём вызов на примерах.
|
Пример
Давайте изменим State через setState:
import 'package:flutter/material.dart';
void main()
{
runApp(
MaterialApp(
home: Scaffold(
body: Center(
child: StepperWidget(),
),
),
),
);
}
class StepperWidget extends StatefulWidget
{
const StepperWidget({super.key});
@override
State<StepperWidget> createState() => _StepperWidgetState();
}
class _StepperWidgetState extends State<StepperWidget>
{
int step = 0;
@override
Widget build(BuildContext context)
{
return ElevatedButton(
onPressed: () => setState(() => step++),
child: Text('step $step'),
);
}
}
На экране подпись кнопки будет расти при каждом нажатии.
Пример
Давайте освободим контроллер в dispose:
import 'package:flutter/material.dart';
void main()
{
runApp(
MaterialApp(
home: Scaffold(
body: Center(
child: FieldHolder(),
),
),
),
);
}
class FieldHolder extends StatefulWidget
{
const FieldHolder({super.key});
@override
State<FieldHolder> createState() => _FieldHolderState();
}
class _FieldHolderState extends State<FieldHolder>
{
final controller = TextEditingController(text: 'abcde');
@override
void dispose()
{
controller.dispose();
super.dispose();
}
@override
Widget build(BuildContext context)
{
return TextField(controller: controller);
}
}
На экране поле покажет 'abcde', а dispose снимет контроллер.
Смотрите также
-
класс
StatefulWidget,
который создаётState -
метод
setState,
который запускает перерисовку -
класс
BuildContext,
доступный вStateкак context -
смесь
AutomaticKeepAliveClientMixin,
которая сохраняетStateво вкладках