Жизненный цикл страницы

Страница проходит путь от создания до выгрузки из памяти, и знание этих этапов определяет, где выполнять запросы, где заводить переменные, а где освобождать ресурсы.

Ключевые моменты в жизни страницы:

  • Инициализация. Страница готовится к показу: загружаются исходные данные, задаются значения по умолчанию, поднимается состояние.
  • Отрисовка. Страница появляется на экране: вёрстка, стили, интерактивные элементы. Пользователь видит её в исходном состоянии.
  • Обновление. Страница реагирует на нажатия, ввод и жесты; в ответ перерисовывается частично или целиком.
  • Выгрузка. Пользователь ушёл со страницы — связанные с ней ресурсы освобождаются.

Большую часть этой механики FlutterFlow берёт на себя. Наружу вынесено то, что решаете вы: что подгрузить при инициализации и когда перерисовать интерфейс.

Триггеры действий страницы

У корня страницы есть несколько триггеров действий.

инфо
Что такое триггеры действий

Триггер действия — это обработчик события: нажатия кнопки, загрузки страницы, отправки формы, изменения данных. Он связывает событие с логикой, которую вы описываете. Подробнее — в разделе Редактор действий.

Открыв редактор действий для страницы, вы увидите такие триггеры.

actions-triggers.png

On Page Load

Действия срабатывают при загрузке страницы: запрос к API, чтение из базы, подготовка переменных, обновление элементов интерфейса.

совет
Что обычно делают
  • Готовят данные. Запрос к API, чтение из базы или локального хранилища — чтобы к моменту показа страницы данные уже были на месте.

  • Задают состояние. Если страница зависит от переключателей, выбранных значений или полей ввода, их начальные значения выставляют здесь.

  • Запускают анимацию. Например, чтобы обратить внимание на важный элемент экрана.

Как добавить действие в On Page Load:

совет
Сгенерированный код

Действия из On Page Load выполняются внутри SchedulerBinding.instance.addPostFrameCallback((_) — то есть после того, как дерево виджетов полностью построено. Подробности — в разделе Страница: сгенерированный код.

On Phone Shake

Действия срабатывают, когда пользователь встряхивает телефон.

совет
Что обычно делают
  • Показывают случайное. Случайное число, цитата, другая картинка на фоне.
  • Обновляют данные. Свежие новости, перезагрузка ленты.
  • Сбрасывают состояние. Очистка формы или возврат на главный экран.

On Shortcut Press

Триггер привязывает действия к сочетаниям клавиш. В веб- и десктопных приложениях это заметно ускоряет работу и помогает тем, кто не пользуется мышью.

совет
Что обычно делают
  • Быстрое создание записи. В таск-трекерах вроде Linear клавиша C открывает форму новой задачи.
  • Отправка формы. Например, по Ctrl + Enter.
  • Переходы между страницами. Ctrl + → листает страницы без мыши.
инфо
Важно
  • Сочетание, заданное на уровне страницы, не сработает, пока фокус находится в поле ввода, — и набрать этот символ в поле тоже не получится.
  • Сочетание на уровне компонента при фокусе в поле ввода тоже не сработает, но символ в поле наберётся.
  • Чтобы не мешать вводу, выбирайте сочетания, а не одиночные буквы: Command + S вместо просто «S».
  • Известная особенность Flutter: если у поля ввода внутри компонента включён автофокус, а у компонента есть сочетание клавиш, автофокус не сработает.

Сочетаний можно завести сколько угодно, каждое со своим набором действий. Разберём пример: в веб-магазине пользователь открывает корзину клавишей C.

Для этого добавьте триггер On Shortcut Press и укажите клавиши, которые приложение должно слушать.

внимание
Сочетания клавиш и поля ввода

Если на странице или в компоненте с полем ввода есть сочетания клавиш, поле должно их игнорировать.

Скажем, у вас есть сочетание на букву «C», и пользователь набирает «C» в поле поиска: нажатие должно попасть в текст, а не открыть корзину.

У виджета TextField для этого есть опция, отключающая обработку сочетаний. Но надёжнее с самого начала брать комбинации вроде Cmd + C, которые с обычным вводом не пересекаются.

On Dispose

On Dispose срабатывает, когда пользователь уходит со страницы и она выгружается из памяти. Это место для остановки того, что было запущено.

Представьте: при загрузке страницы через On Page Load начинается запись звука. Пока человек на странице, запись идёт. Стоит ему уйти — запись нужно остановить и корректно сохранить файл; этим и занимается On Dispose.

Если вы используете сторонний пакет с постоянными соединениями или слушателями, закройте их здесь же — через кастомные действия.

совет
Что обычно делают
  • Освобождают ресурсы. Отменяют таймеры, закрывают соединения с базой, отписываются от потоков — иначе утечки памяти и лишняя нагрузка.
    • Пример: биржевое приложение держит WebSocket ради живых котировок. Соединение открывается при загрузке страницы и закрывается в On Dispose. Без этого оно останется висеть, расходуя ресурсы и расшатывая работу приложения.
  • Завершают транзакции. Фиксируют или откатывают операцию, если пользователь ушёл, не закончив.
  • Пишут аналитику. Отмечают уход со страницы и время, проведённое на ней. ::: page-on-dispose.avif

Состояние страницы

:::note[Переменные состояния] Переменная состояния хранит данные о том, в каком виде интерфейс находится прямо сейчас. Подробнее — в руководстве по управлению состоянием.

Состояние страницы (Page State) — это то, что страница знает о себе в текущий момент: какая вкладка открыта, что введено в форму, что выбрал пользователь. Такие переменные видны только в пределах своей страницы.

Сюда кладут данные, общие для виджетов одного экрана: содержимое формы, поисковый запрос, выбранные фильтры и порядок сортировки.

Например:

  • в многошаговой форме переменная Page State хранит номер текущего шага и введённое на каждом шаге;
  • на странице результатов поиска — сам запрос, а также применённые фильтры и сортировку.

Так страница сохраняет своё состояние, пока пользователь работает с её виджетами и компонентами.

Когда переменная меняется, страницу можно перерисовать — и она покажет обновлённые данные.

Создание переменной

Порядок действий:

При создании задаются три свойства:

  • Is List — переменная хранит список значений одного типа, а не одно значение.

  • Initial Field Value — начальное значение, с которым переменная появляется.

  • Nullable — переменная может быть пустой (null). Пригодится, когда данные необязательны и отсутствие значения — нормальное состояние.

Посмотрим на них применительно к переменной searchString из примера с поиском:

  • Is List выключено: строка поиска хранит один запрос, а не набор.

  • Начальное значение — пустая строка (""): при открытии страницы поле поиска пустое.

  • Nullable включено: пока пользователь ничего не искал, переменная равна null — по этому признаку видно, что поиска ещё не было.

заметка

Тип переменной Page State может быть примитивным — String, Integer, Boolean, Double — или сложным: Enum, Custom Data Type, Document. Обо всех типах — в разделе о представлении данных.

Чтение значения

Значение Page State доступно в любом месте текущей страницы: любой виджет может показать его в интерфейсе или использовать в логике.

Привязать значение виджета к переменной можно везде, где встречается вот такая иконка.

Page-State.png

Действие Update Page State

Значение Page State меняется только действиями. Нужно обновить состояние по нажатию кнопки, вводу в форму или другому событию — добавьте действие Update Page State.

Перерисовка при обновлении

В настройках действия есть свойство Update Type:

Rebuild Current Page — перерисовать страницу, чтобы изменения появились в интерфейсе.

No Rebuild — обновить значение, не трогая интерфейс.

совет

Если нужно перерисовать страницу, не меняя переменных, используйте действие Rebuild.

внимание
Перерисовка не бесплатна

Каждая перестройка дерева виджетов тратит ресурсы. Слишком частые перерисовки бьют по отзывчивости интерфейса и по батарее, поэтому Rebuild стоит включать там, где он действительно нужен.

Что при этом происходит под капотом, описано в разделе о сгенерированном коде страницы.

перевод официальной документации FlutterFlow

обновлено

⌕ ESC