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

if-elseStatement:
Оператор if-else предоставляет альтернативный блок кода для выполнения, если условие ложно.

Здесь, если userIsLoggedIn истинно, приложение отобразит приветственное сообщение. В противном случае оно предложит пользователю войти в систему.
else ifStatement:
Оператор else if можно использовать для последовательной проверки нескольких условий.

Этот пример демонстрирует несколько условий. Если userIsLoggedIn истинно, отображается приветственное сообщение. Если нет, проверяется, истинно ли userIsGuest, и отображается сообщение для гостя. Если ни одно из условий не выполнено, пользователю предлагается войти в систему.
Реализация условных конструкций
В FlutterFlow условную логику можно реализовать двумя основными способами:
-
В FlutterFlow вы можете условно устанавливать свойства виджетов. Например, вы можете изменить цвет кнопки в зависимости от значения переменной. Для динамической установки этих свойств во время выполнения можно использовать условные выражения.
-
Вы также можете выполнять условные действия в FlutterFlow, где определенные действия выполняются только при выполнении указанных условий. Это полезно для реализации логики, такой как переход на разные страницы в зависимости от ввода пользователя или отображение/скрытие виджетов.
Пример: Если пользователь нажимает кнопку и форма действительна, перейти на следующий экран; в противном случае показать сообщение об ошибке.
Ознакомьтесь с полным руководством здесь. Хотите узнать о реализации условного интерфейса? Ознакомьтесь с нашим руководством Responsiveness 101 вместо этого.
Последовательный поток логики против параллельного
-
Последовательный поток логики: Действия выполняются одно за другим. Каждое действие ждет завершения предыдущего, прежде чем начаться. Это полезно для задач, которые зависят от результатов предыдущих действий.
Пример: Отправка формы, ожидание ответа сервера и последующее отображение сообщения о подтверждении.
-
Параллельный поток логики Несколько действий выполняются одновременно, независимо друг от друга. Это полезно для задач, которые можно выполнять параллельно и которые не зависят от результатов д руг друга.
Пример: Загрузка данных из нескольких источников одновременно для ускорения процесса получения данных.

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