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

Переменные во FlutterFlow делятся на две группы:
- Локальные — живут внутри конкретной страницы или компонента. Переменные Page State и Component State видны только там, где созданы.
- Глобальные — доступны во всём приложении. Так работают переменные App State: к ним можно обратиться с любой страницы.
Область видимости определяется тем, где переменная создана. Созданная на уровне приложения доступна везде; созданная на уровне страницы — только на этой странице. Правило простое, но именно из-за него чаще всего и не находят «пропавшую» переменную.
Создание переменных
При создании переменной задаются четыре вещи: имя, тип данных, допустимость null и начальное значение. Сам порядок действий отличается для App State, Page State и Component State — ссылки на пошаговые инструкции собраны ниже.
Имя
Имя должно говорить, что внутри: по нему вы будете обращаться к переменной по всему проекту.
Для переменных используйте lowerCamelCase. Остальные соглашения об именовании во FlutterFlow и Flutter-проектах собраны в отдельном руководстве: имена переменных и функций.
Тип данных
Дальше выбирается тип: Text, Integer, Boolean и другие. Что бывает и чем отличается — в руководстве по типам данных.
Тип определяет, что переменная может хранить и как её потом использовать, поэтому менять его на ходу дороже, чем выбрать сразу верно.
Свойство Is List
Переключатель Is List превращает поле в список.
Если выбран тип String и включён Is List, FlutterFlow создаст список строк — например, перечень городов.
Nullable и начальное значение
Переменная может быть nullable или non-nullable: это определяет, вправе ли она существовать вовсе без значения. Рядом задаётся начальное значение — то, с чем переменная появляется на свет.

-
Nullable — переменная может быть пустой (null) и получить значение позже. Если выключено, значение должно быть всегда, поэтому начальное придётся указать.
-
Initial Value — для non-nullable переменной обязательно, для nullable необязательно: такая переменная просто остаётся пустой, пока в неё что-нибудь не запишут.
Null — это отсутствие значения, и оно нередко полезнее пустой строки или нуля:
- Ввод пользователя. До того как человек что-то ввёл, переменная пуста — и это честно отражает положение дел.
- Условная логика. Необязательная настройка может быть не задана вовсе; null позволяет отличить «не выбрано» от «выбрано пустое».
- Загрузка. Пока данные с API не пришли, переменная равна null — по этому признаку легко отличить состояние «грузится» от «загружено».
Пошаговые инструкции
Как создаются переменные каждого вида:
Меню Set Variable
Меню Set from Variable (оно же Set Variable) — это место, где значение виджета связывается с данными. Выбирая здесь переменную, вы говорите FlutterFlow: подставь сюда её значение — в текст, в видимость, в стиль.
Источники в этом меню разные: данные текущей страницы или компонента, глобальные свойства приложения, константы и другие. От выбора источника и зависит, откуда виджет возьмёт значение.

Преобразование значений
Значение необязательно подставлять как есть — в том же меню его можно преобразовать перед тем, как отдать виджету или другой переменной.
Например:
- Склеить строки — собрать одно значение из нескольких; как это делается, описано в разделе служебных функций.
- Отфильтровать или отсортировать список — оставить только нужное и в нужном порядке.
- Перевести DateTime в UNIX-время — когда получателю нужен timestamp, а не дата.
- Применить условие — подставить разные значения по If/Then/Else.
Так данные попадают в интерфейс уже в том виде, в каком их нужно показать, без промежуточных переменных и лишних действий.
Операции над списками
Со списком редко работают целиком: обычно нужна часть данных или их срез. Для этого во FlutterFlow есть набор операций.
Map List Items
Map List Items собирает список значений одного поля из списка объектов — документов, собственных типов данных или JSON. Например, из списка документов Firebase с полями name, age и position можно получить список одних только имён.
Ниже — пример: из документов Firebase (с полями name, age и breed) собирается список кличек котов и выводится в выпадающем списке.
Filter List Items
Filter List Items оставляет в списке только те элементы, которые подходят под условие: пользователи старше определённого возраста, товары в заданном ценовом диапазоне.
First Few Items
First Few Items берёт заданное количество элементов с начала списка.

Sort List Items
Списки простых типов — чисел и строк — FlutterFlow сортирует сам: у них есть естественный порядок (1, 2, 3…, «apple», «banana», «cherry»). Для такого списка достаточно указать Sort Key — сам элемент.
Пример: случайные имена выстраиваются по алфавиту.
Сначала отсортируйте список обычным способом, а затем включите у ListView опцию reverse — получится порядок по убыванию.
Для списков с собственными типами данных в Sort Key нужно указать поле, по которому сортировать; тип этого поля должен быть простым, с понятным порядком.
Вот как вывести список объектов типа Product, отсортированный по цене.
Unique List Items
Оставляет в списке только неповторяющиеся значения: категории товаров, имена клиентов.
Пример — список пород котов без повторов:
Чтобы получить уникальные значения из списка собственного типа данных, сначала соберите список нужного поля через Map List Items — например, из списка Products получите список названий, — и уже из него берите уникальные.
Number of Items
Возвращает количество элементов в списке.
Item at Index
Item at Index достаёт элемент по его позиции: третье имя в списке клиентов, пятый товар в каталоге. Пригодится, когда порядок важен сам по себе — например, нужна последняя запись в журнале, — или когда проще взять элемент напрямую, чем фильтровать весь список.
Is Set and Not Empty
Is Set And Not Empty отвечает на вопрос, есть ли в списке хоть что-нибудь. Так проверяют, вернул ли поиск результаты и записались ли собранные данные.
Изменение значений
Значения переменных меняются действиями: по нажатию кнопки, по изменению поля формы, по любому другому событию.
Пошаговые инструкции по каждому виду переменных: