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

Класс 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();
}