Перейти к основному содержимому

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

В разработке приложений управление потоком относится к порядку, в котором выполняются или оцениваются отдельные операторы, инструкции или вызовы функций. Правильное управление потоком гарантирует, что ваше приложение ведет себя ожидаемым образом в различных условиях и при взаимодействии с пользователем. Это включает понимание и реализацию условных конструкций, управление последовательными и параллельными потоками логики, обработку блокирующих и неблокирующих действий, а также принятие решений о том, когда и как выполнять конкретные действия на основе определенных критериев.

В этом разделе мы рассмотрим различные концепции управления потоком и то, как их можно эффективно реализовать в FlutterFlow для создания динамичных, отзывчивых и производительных приложений.

Условные конструкции

Одним из фундаментальных аспектов управления потоком является использование условных конструкций, которые позволяют приложению принимать решения и выполнять разные блоки кода в зависимости от конкретных критериев. Условные операторы — это выражения, которые оцениваются как истинные или ложные. В зависимости от результата такой оценки выполняются разные последовательности логики.

Основные условные операторы — это if, if-else и else.

  • if Statement: Оператор if оценивает условие и выполняет блок кода, если условие истинно.

Оператор if оценивает условие и выполняет блок кода, если условие истинно.

if-condition.png

  • if-else Statement:

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

if-else-condition.png

Здесь, если userIsLoggedIn истинно, приложение отобразит приветственное сообщение. В противном случае оно предложит пользователю войти в систему.

  • else if Statement:

Оператор else if можно использовать для последовательной проверки нескольких условий.

if-elseif-condition.png

Этот пример демонстрирует несколько условий. Если userIsLoggedIn истинно, отображается приветственное сообщение. Если нет, проверяется, истинно ли userIsGuest, и отображается сообщение для гостя. Если ни одно из условий не выполнено, пользователю предлагается войти в систему.

Реализация условных конструкций

В FlutterFlow условную логику можно реализовать двумя основными способами:

  • При установке свойств

    В FlutterFlow вы можете условно устанавливать свойства виджетов. Например, вы можете изменить цвет кнопки в зависимости от значения переменной. Для динамической установки этих свойств во время выполнения можно использовать условные выражения.

  • Условные действия

    Вы также можете выполнять условные действия в FlutterFlow, где определенные действия выполняются только при выполнении указанных условий. Это полезно для реализации логики, такой как переход на разные страницы в зависимости от ввода пользователя или отображение/скрытие виджетов.

    Пример: Если пользователь нажимает кнопку и форма действительна, перейти на следующий экран; в противном случае показать сообщение об ошибке.

к сведению

Ознакомьтесь с полным руководством здесь. Хотите узнать о реализации условного интерфейса? Ознакомьтесь с нашим руководством Responsiveness 101 вместо этого.

Последовательный поток логики против параллельного

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

    Пример: Отправка формы, ожидание ответа сервера и последующее отображение сообщения о подтверждении.

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

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

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

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

Они могут быть блокирующими или неблокирующими в зависимости от случая использования. Примерами асинхронных операций являются:

  • Сетевые запросы (например, получение данных из API)
  • Операции с базой данных (например, чтение или запись данных)
  • Длительные вычисления (например, сложные расчеты)
  • Анимации (например, переходы, анимации виджетов)

Блокирующие действия

Блокирующие действия — это действия, которые приостанавливают выполнение последующих действий до своего завершения. Такие действия обычно включают операции, требующие времени, такие как сетевые запросы или анимации.

Generated Code

В генерируемом коде FlutterFlow использует ключевое слово await, чтобы приостановить выполнение асинхронной функции до завершения операции, прежде чем перейти к следующей функции. Этот подход обычно применяется для обработки асинхронных функций, гарантируя, что каждая операция завершится перед началом следующей.

В следующем примере из генерируемого кода код ожидает actions.getRandomIntAfterWait(), поскольку это асинхронная функция, которая занимает около 2 секунд для завершения и предоставления результата (в данном случае случайного целого числа).

    _model.result = await actions.getRandomIntAfterWait();
_model.text1Value = _model.result.toString();

Результат actions.getRandomIntAfterWait() сохраняется в переменной model.result, а затем этот результат устанавливается для виджета Text с помощью переменной состояния страницы text1Value.

Неблокирующие действия

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

Generated Code

В генерируемом коде, когда асинхронная функция делается неблокирующей, FlutterFlow удаляет ключевое слово await. Это означает, что следующая функция не будет ждать завершения асинхронного действия и сразу перейдет к следующему действию.

Предыдущий пример больше не будет работать, поскольку он не ожидает асинхронную функцию actions.getRandomIntAfterWait(). В результате переменная model.result может быть не готова или недоступна, когда выполняется _model.text1Value = _model.result.toString();.

_model.result = actions.getRandomIntAfterWait();
_model.text1Value = _model.result.toString(); // will throw errors

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

Неблокирующие действия против параллельных

Неблокирующие действияПараллельные действия
Позволяет следующему действию запускаться немедленно после текущего без ожидания завершения текущего действия.Позволяет запускать два или более действий одновременно независимо друг от друга.
Только асинхронные функции могут быть неблокирующими.Как асинхронные, так и синхронные функции могут включаться в параллельные действия.
Идеально для задач, где результат действия не нужен следующему действию немедленно.Идеально для независимых задач, которые можно выполнять одновременно для повышения эффективности.
Обеспечивает отзывчивость приложения, не ожидая завершения длительных задач.Помогает сократить общее время выполнения за счет параллельного выполнения нескольких задач.
Пример: Получение данных в фоновом режиме при сохранении возможности взаимодействия с пользователем.Пример: Загрузка данных из двух API одновременно для экономии времени.