Класс PageModel
В этом руководстве используется пример сгенерированного кода демонстрационного приложения EcommerceFlow. Чтобы просмотреть сгенерированный код непосредственно, ознакомьтесь с репозиторием на Github.
При создании новой страницы в FlutterFlow автоматически создаются два файла: класс Widget
и класс Model
. Классы PageModel
отвечают за управление состоянием отдельных страниц и инициализацию используемых на этих страницах компонентов. Эти классы расширяют класс FlutterFlowModel
, который предоставляет единообразную структуру и общую функциональность для всех моделей страниц.
Класс PageModel
обычно содержит локальные поля состояния, специфичные для страницы, которые соответствуют переменным состояния страницы. Например, в файле product_list_page_model.dart
ссылка (который является файлом Model
для ProductListPage
) одним из полей состояния может быть _searchString
. Это приватное поле хранит текущую строку поиска и включает геттер и сеттер для управления его значением и записи любых изменений.
String? _searchString;
set searchString(String? value) {
_searchString = value;
debugLogWidgetClass(rootModel);
}
String? get searchString => _searchString;
Помимо управления локальным состоянием, класс PageModel
также содержит поля для обработки состояния виджетов на странице. Например, _dropDownValue
- это приватное поле, которое хранит текущее значение виджета выпадающего списка. Аналогично _searchString
, у него есть геттер и сеттер, который регистрирует изменения этого поля.
String? _dropDownValue;
set dropDownValue(String? value) {
_dropDownValue = value;
debugLogWidgetClass(rootModel);
}
String? get dropDownValue => _dropDownValue;
Класс PageModel
также отвечает за инициализацию моделей компонентов, используемых на странице. Например, если на странице есть компонент CartCounter
, модель для этого компонента инициализируется внутри класса модели страницы.
// Модель для компонента CartCounter.
late CartCounterModel cartCounterModel;
@override
void initState(BuildContext context) {
cartCounterModel = createModel(context, () => CartCounterModel()..parentModel = this);
}
При работе с динамическими списками компонентов, такими как в ListView
, Row или Column виджетах, PageModel
инициализирует Map<String, FlutterFlowModel>
для управления состоянием каждого экземпляра компонента. Например, если на странице есть список компонентов CategoryAvatar
, инициализация может выглядеть так:
// Модели для динамического компонента CategoryAvatar.
Map<String, FlutterFlowModel> categoryAvatarModels = {};
Наконец, функция dispose
в классе ProductListPageModel
используется для освобождения ресурсов, когда они больше не нужны. Это общая практика в Flutter для предотвращения утечек памяти. В этом классе функция dispose
переопределяется для удаления cartCounterModel
, searchQueryFocusNode
и searchQueryTextController
.
@override
void dispose() {
cartCounterModel.dispose();
searchQueryFocusNode?.dispose();
searchQueryTextController?.dispose();
}