Создаем портфолио за 1 месяц
К концу месяца: 4 классных проекта в вашем портфолио! Стоимость: 100$. Подробности...
766 of 1024 menu
◀ ▶

Класс 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 снимет контроллер.

Смотрите также

← →
↑
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить