Как устроен поток управления

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

Условия

Условие позволяет приложению выбрать один из вариантов поведения. Условное выражение всегда даёт истину или ложь, и в зависимости от результата выполняется тот или иной набор действий.

Основные формы — if, if-else и else.

  • if — проверяет условие и выполняет блок, если оно истинно.

if-condition.png

  • if-else

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

if-else-condition.png

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

  • else if

Позволяет проверить несколько условий подряд.

if-elseif-condition.png

Здесь сначала проверяется userIsLoggedIn, затем userIsGuest, и только если не выполнилось ни то ни другое, приложение предлагает войти.

Условия во FlutterFlow

Условную логику применяют двумя способами:

  • В свойствах виджета

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

  • В действиях

    Действие выполняется, только если условие соблюдено: перейти на разные страницы в зависимости от ввода, показать или спрятать виджет.

    Пример: по нажатию кнопки проверяем форму — если она заполнена верно, идём дальше, если нет, показываем ошибку.

инфо

Полное руководство по условиям. Если же вам нужен адаптивный интерфейс, смотрите Адаптивность 101.

Последовательно или параллельно

  • Последовательный поток Действия выполняются одно за другим: каждое ждёт завершения предыдущего. Так поступают, когда шаг зависит от результата предыдущего.

    Пример: отправить форму, дождаться ответа сервера, показать подтверждение.

  • Параллельный поток Несколько действий выполняются одновременно и независимо друг от друга. Подходит для задач, которые не связаны между собой.

    Пример: загрузить данные из нескольких источников сразу, чтобы не ждать по очереди. parallel-sequential.png

Асинхронные функции

Асинхронная операция не завершается мгновенно: она может занять время из-за сети или вычислений.

В зависимости от задачи её делают блокирующей или неблокирующей. Асинхронны, например:

  • сетевые запросы (обращение к 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 уходят одновременно
перевод официальной документации FlutterFlow

обновлено

ESC