FFAppState
В этом руководстве используется пример сгенерированного кода демонстрационного приложения EcommerceFlow. Чтобы просмотреть сгенерированный код непосредственно, посетите репозиторий на GitHub.
Класс FFAppState
в FlutterFlow действует как центральный хаб для управления глобальным состоянием приложения. Он разработан как синглтон, что означает, что в течение жизненного цикла приложения существует только один экземпляр этого класса. Этот класс расширяет ChangeNotifier, позволяя виджетам прослушивать и реагировать на изменения состояния.
Он включает методы для инициализации и обновления сохраненного состояния приложения, а также определяет различные переменные состояния с соответствующими геттерами и сеттерами для управления этими значениями.
Вот базовый шаблон класса, взятого из сгенерированного кода демонстрационного приложения EcommerceFlow:
class FFAppState extends ChangeNotifier {
static FFAppState _instance = FFAppState._internal();
factory FFAppState() {
return _instance;
}
FFAppState._internal();
static void reset() {
_instance = FFAppState._internal();
}
void update(VoidCallback callback) {
callback();
notifyListeners();
}
// Переменная состояния приложения примитивного типа с геттером и сеттером
bool _enableDarkMode = false;
bool get enableDarkMode => _enableDarkMode;
set enableDarkMode(bool value) {
_enableDarkMode = value;
}
}
Переменная _enableDarkMode
- это переменная состояния приложения, созданная разработчиком, который создает собственные соответствующие геттер и сеттер.
Обновление FFAppState
При обновлении FFAppState через Edtior Action Flow, вы увидите несколько вариантов типа обновления, таких как Пересоздать все страницы, Пересоздать текущую страницу и Без пересборки. Давайте посмотрим, как изменяется сгенерированный код, когда выбраны эти варианты.
Пересоздать текущую страницу
Когда разработчик выбирает обновление состояния приложения с установленным типом обновления Пересоздать текущую страницу, вызывается соответствующий setter
. Сразу после этого вызывается setState((){});
, который обновляет только текущую страницу.
Вот пример сгенерированного кода, когда мы обновляем состояние приложения enableDarkMode
в триггере действия onInitialization
страницы ProductListPage
.
SchedulerBinding.instance.addPostFrameCallback((_) async {
FFAppState().enableDarkMode = !(FFAppState().enableDarkMode ?? true);
setState(() {});
});
Пересоздать все страницы
В этом случае тип обновления установлен на Пересоздать все страницы, что означает, что вызывается setter
, за которым следует метод update()
. Этот метод внутри вызывает notifyListeners()
, что является важным для обновления виджетов, зависящих от этой переменной.
SchedulerBinding.instance.addPostFrameCallback((_) async {
FFAppState().enableDarkMode = !(FFAppState().enableDarkMode ?? true);
FFAppState().update(() {});
});
При обновлении переменных состояния приложения из пользовательского кода, такого как Пользовательские действия, важно вызывать функцию обновления, чтобы гарантировать, что изменения отражаются на всех страницах. Например, вы должны использовать:
FFAppState().update(() => FFAppState().enableDarkMode = !(FFAppState().enableDarkMode ?? true));
Без пересборки
Вызывается только setter
, далее никакие методы setState
или update
не вызываются. Это означает, что только переменная обновляется, и после обновления данных изменения состояния не происходят.
watch<FFAppState>
При добавлении действия Обновить состояние приложения через Edtior Action Flow, соответствующие страницы будут содержать эту строку внутри метода build
:
@override
Widget build(BuildContext context) {
context.watch<FFAppState>();
...
Используя context.watch<FFAppState>()
, виджет эффективно подписывается на любые изменения в классе FFAppState
. Когда происходит изменение объекта FFAppState
, этот виджет автоматически перестраивается, отражая эти изменения. Это гарантирует, что ваш виджет всегда отображает наиболее текущие данные и состояние приложения, обеспечивая актуальный и отзывчивый пользовательский интерфейс.
Управление AppState<List>
При добавлении переменной состояния приложения типа List
в FlutterFlow автоматически генерируются несколько вспомогательных функций, которые помогут вам управлять этим списком. Эти функции включают геттер, сеттер и методы для добавления, удаления и обновления элементов в списке. Такая настройка обеспечивает простоту взаимодействия со списком, сохраняя при этом консистентное и отзывчивое состояние приложения. Ниже приведено объяснение этих сгенерированных функций на конкретном примере LatLngList
.
late LoggableList<LatLng> _LatLngList =
LoggableList([LatLng(37.4071594, -122.0775312), LatLng(40.7358633, -73.9910835)]);
List<LatLng> get LatLngList => _LatLngList?..logger = () => debugLogAppState(this);
set LatLngList(List<LatLng> value) {
if (value != null) {
_LatLngList = LoggableList(value);
}
debugLogAppState(this);
}
void addToLatLngList(LatLng value) {
LatLngList.add(value);
}
void removeFromLatLngList(LatLng value) {
LatLngList.remove(value);
}
void removeAtIndexFromLatLngList(int index) {
LatLngList.removeAt(index);
}
void updateLatLngListAtIndex(
int index,
LatLng Function(LatLng) updateFn,
) {
LatLngList[index] = updateFn(_LatLngList[index]);
}
void insertAtIndexInLatLngList(int index, LatLng value) {
LatLngList.insert(index, value);
}
Эти функции автоматически генерируются для обеспечения удобного и последовательного способа управления переменными состояния типа списка, что упрощает поддержание состояния приложения:
- Список
LatLngList
инициализируется как приватная переменная_LatLngList
типаLoggableList
, которая помогает управлять списком с дополнительной возможностью журналирования. - Метод
get LatLngList
позволяет другим частям приложения получить доступ кLatLngList
. - Метод
set LatLngList
позволяет заменить весьLatLngList
на новый. При присвоении нового списка обновляется приватная переменная_LatLngList
, и это изменение регистрируется с помощьюdebugLogAppState
. - Функция
addToLatLngList
добавляет новый объектLatLng
вLatLngList
, динамически обновляя список при работе приложения. - Функция
removeFromLatLngList
удаляет конкретный объектLatLng
изLatLngList
, гарантируя точность и актуальность списка. - Функция
removeAtIndexFromLatLngList
удаляет объектLatLng
из списка на основе его позиции индекса. - Функция
updateLatLngListAtIndex
позволяет обновлять объектLatLng
в конкретном индексе, применяя к нему функцию обновления (updateFn
). - Функция
insertAtIndexInLatLngList
вставляет новый объектLatLng
вLatLngList
в конкретный индекс, сдвигая существующие элементы при необходимости.
Чтобы узнать больше о создании и использовании переменных состояния приложения в пользовательском интерфейсе FlutterFlow, ознакомьтесь с руководством Переменные состояния.