Управление состоянием UI
В Duit управления состоянием UI основано на трех основных компонентах: контролируемых виджетах, действиях и событиях. Контролируемые виджеты - концепция управления состоянием UI на основе явного указания того, что виджет может быть изменен извне.
Зачем это нужно?
Контроллируемые виджеты реализованы на базе StatefulWidget и используют жизненный цикл State для реализации механизма обновления состояния представления. При бездумном создании всех виджетов в Stateful варианте, мы накладываем на систему дополнительные накладные расходы на создание и хранение множетсва объектов State, которые нам никогда не пригодятся.
Разделение виджетов и явное указание на то, может ли он быть обновлен извне - необходимая оптимизация для экономии ресурсов системы.
Устройство виджетов Duit
Виджет Duit представляет собой обертку над конкретным виджетом Flutter и при обработке макета может
создать
один из
двух вариантов виджетов:
контроллируемый
или неконтроллируемый. Это зависит от значения поля controlled модели элемента. Такая обертка
служит для правильной передачи параметров виджета, а также управления внутренним
состоянием контроллируемых виджетов.
Типовая модель виджета:
{
"type": "Text",
"controlled": true,
"id": "text_1",
"attributes": {
"data": "Hello"
}
}
Некоторые виджеты по умолчанию всегда являются контроллируемыми в связи с тем, что обеспечивают обработку пользовательского ввода, дозапрашивают данные для наполнения или просто выполняют связанные действия.
- ElevatedButton
- ListView.builder & ListView.separated
- Checkbox
- Component
- GestureDetector
- LifecycleStateListener
- Meta
- Radio
- Subtree
- Slider
- Switch
- TextField
- AnimationBuilder
Еще одним важным отличием двух вариантов виджетов является то, как они получают данные для постоения сопоставленного виджета. Контроллируемые виджеты получают данные не напрямую из атрибутов элемента, а через связанный с виджетом контроллер. Благодаря наличию контроллера реализовано управление состоянием контроллируемого виджета, а также обработка взаимодействия пользователя и UI с помощью выполнения связынных с элементом интерфейса действий.
// Simple widget variant
final class DuitText extends StatelessWidget with AnimatedAttributes {
final ViewAttribute attributes;
//other code
}
/// Controlled variant
final class DuitControlledText extends StatefulWidget with AnimatedAttributes {
final UIElementController controller;
//other code
}
Контроллер
Контроллеры представляют собой объект, который реализует интерфейс UIElementController. Он
обеспечивает двунаправленную связь между драйвером и виджетами, помогает в обработке дейтствий, а
также отвечает за обновление состояние виджета.
При создании нового контроллируемого виджета, Duit осуществляет подписку виджета на изменение атрибутов контроллера.
При получении нового события, например события update, драйвер находит необходимый контроллер и
вызывает метод, отвечающий за обновление текущих атрибутов виджета. После этого контроллер
уведомляем виджет о том, что атрибуты были изменены извне и что надо перестроиться.