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

Модель FlutterFlow

Класс FlutterFlowModel представляет собой абстрактный класс, используемый в FlutterFlow для обеспечения единой и расширяемой структуры управления состоянием и поведением виджетов (как страниц, так и компонентов). Он инкапсулирует логику инициализации, управления состоянием и освобождения ресурсов, упрощая обработку жизненного цикла виджетов и их моделей.

FlutterFlow автоматически генерирует файл flutter_flow_model.dart, который содержит класс FlutterFlowModel и вспомогательные методы, такие как wrapWithModel() и createModel().

Ниже приведена диаграмма, иллюстрирующая, как эти вспомогательные классы и методы используются в классе виджета или модели:

page-generated.png

Когда компонент добавляется на вашу страницу (и каждый создаваемый вами компонент генерирует как виджет, так и класс модели), приведённая ниже схема объясняет, как используются вспомогательные классы при наличии дочернего компонента:

page-component-generated.png

Вот разбивка жизненного цикла класса FlutterFlowModel:

Инициализация

Обеспечивает инициализацию модели только один раз и связывает её с BuildContext и связанным с ней виджетом.

abstract class FlutterFlowModel<W extends Widget> {
// Initialization methods
bool _isInitialized = false;
void initState(BuildContext context);
void _init(BuildContext context) {
if (!_isInitialized) {
initState(context);
_isInitialized = true;
}
if (context.widget is W) _widget = context.widget as W;
_context = context;
}

Ссылки на виджет и контекст

Предоставляет ссылки на связанный виджет и его BuildContext.

  // The widget associated with this model. This is useful for accessing the
// parameters of the widget, for example.
W? _widget;
W? get widget => _widget;

// The context associated with this model.
BuildContext? _context;
BuildContext? get context => _context;

_widget и _context (приватные поля) хранят ссылки на виджет и контекст. widget и context (геттеры) являются публичными акцессорами для _widget и _context.

Освобождение ресурсов

Управляет очисткой ресурсов при освобождении модели или виджета.

 bool disposeOnWidgetDisposal = true;
void dispose();
void maybeDispose() {
if (disposeOnWidgetDisposal) {
dispose();
}
// Remove reference to widget for garbage collection purposes.
_widget = null;
}

disposeOnWidgetDisposal определяет, следует ли освобождать модель при удалении виджета. По умолчанию это true для страниц и false для компонентов (поскольку родительские модели обычно управляют своими дочерними компонентами).

maybeDispose() проверяет disposeOnWidgetDisposal перед освобождением. Он удаляет ссылку на виджет, чтобы помочь сборщику мусора.

Обновления и уведомления об изменениях

Позволяет модели уведомлять связанный виджет или родительский компонент/страницу при возникновении обновлений.

 // Whether to update the containing page / component on updates.
bool updateOnChange = false;
// Function to call when the model receives an update.
VoidCallback _updateCallback = () {};
void onUpdate() => updateOnChange ? _updateCallback() : () {};

FlutterFlowModel setOnUpdate({
bool updateOnChange = false,
required VoidCallback onUpdate,
}) =>
this
.._updateCallback = onUpdate
..updateOnChange = updateOnChange;

// Update the containing page when this model received an update.
void updatePage(VoidCallback callback) {
callback();
_updateCallback();
}

wrapWithModel()

Метод wrapWithModel() в FlutterFlow связывает модель с виджетом и его дочерними виджетами, позволяя им получать доступ и управлять состоянием. Он оборачивает виджет в Provider, делая модель доступной во всём дереве виджетов.