Как устроен поток управления
Поток управления — это порядок выполнения инструкций и вызовов. От него зависит, поведёт ли себя приложение предсказуемо в разных ситуациях. Разберём условия, последовательные и параллельные потоки, блокирующие и неблокирующие действия — и то, как всё это устроено во FlutterFlow.
Условия
Условие позволяет приложению выбрать один из вариантов поведения. Условное выражение всегда даёт истину или ложь, и в зависимости от результата выполняется тот или иной набор действий.
Основные формы — if, if-else и else.
if— проверяет условие и выполняет блок, если оно истинно.

if-else
Даёт запасной вариант на случай, когда условие ложно.

Если userIsLoggedIn истинно, приложение здоровается с пользователем; иначе предлагает войти.
else if
Позволяет проверить несколько условий подряд.

Здесь сначала проверяется userIsLoggedIn, затем userIsGuest, и только если не выполнилось ни то ни другое, приложение предлагает войти.
Условия во FlutterFlow
Условную логику применяют двумя способами:
-
Свойство виджета можно задать условным выражением: скажем, цвет кнопки будет зависеть от значения переменной и пересчитается во время работы приложения.
-
Действие выполняется, только если условие соблюдено: перейти на разные страницы в зависимости от ввода, показать или спрятать виджет.
Пример: по нажатию кнопки проверяем форму — если она заполнена верно, идём дальше, если нет, показываем ошибку.
Полное руководство по условиям. Если же вам нужен адаптивный интерфейс, смотрите Адаптивность 101.
Последовательно или параллельно
-
Последовательный поток Действия выполняются одно за другим: каждое ждёт завершения предыдущего. Так поступают, когда шаг зависит от результата предыдущего.
Пример: отправить форму, дождаться ответа сервера, показать подтверждение.
-
Параллельный поток Несколько действий выполняются одновременно и независимо друг от друга. Подходит для задач, которые не связаны между собой.
Пример: загрузить данные из нескольких источников сразу, чтобы не ждать по очереди.

Асинхронные функции
Асинхронная операция не завершается мгновенно: она может занять время из-за сети или вычислений.
В зависимости от задачи её делают блокирующей или неблокирующей. Асинхронны, например:
- сетевые запросы (обращение к API);
- работа с базой данных (чтение и запись);
- долгие вычисления;
- анимации.
Блокирующие действия
Блокирующее действие останавливает выполнение следующих, пока не завершится само. Так ведут себя сетевые запросы и анимации, когда результат нужен дальше по цепочке.
В коде это ключевое слово await: выполнение приостанавливается до завершения асинхронной операции.
В примере ниже код ждёт actions.getRandomIntAfterWait() — эта функция работает около двух секунд и возвращает случайное число.
_model.result = await actions.getRandomIntAfterWait();
_model.text1Value = _model.result.toString();Результат сохраняется в model.result, а затем попадает в виджет Text через переменную состояния страницы text1Value.
Неблокирующие действия
Неблокирующее действие не задерживает остальные: они выполняются, пока оно работает в фоне.
Когда асинхронное действие сделано неблокирующим, FlutterFlow убирает await. Следующее действие стартует немедленно, не дожидаясь результата.
Пример выше в таком виде уже не сработает: model.result может быть ещё не готов к моменту, когда выполняется _model.text1Value = _model.result.toString();.
_model.result = actions.getRandomIntAfterWait();
_model.text1Value = _model.result.toString(); // приведёт к ошибкеОтсюда правило: неблокирующими делайте только те действия, чей результат следующим шагам не нужен.
Неблокирующие и параллельные — не одно и то же
| Неблокирующие действия | Параллельные действия |
|---|---|
| Следующее действие стартует сразу, не дожидаясь завершения текущего | Два и более действия выполняются одновременно и независимо |
| Неблокирующими можно сделать только асинхронные функции | В параллельный блок попадают и асинхронные, и синхронные функции |
| Подходят там, где результат действия следующему шагу не нужен | Подходят для независимых задач, которые выгодно выполнять разом |
| Интерфейс не замирает на долгой операции | Общее время выполнения сокращается |
| Пример: данные грузятся в фоне, пользователь продолжает работать | Пример: запросы к двум API уходят одновременно |