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

Управление состоянием 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, драйвер находит необходимый контроллер и вызывает метод, отвечающий за обновление текущих атрибутов виджета. После этого контроллер уведомляем виджет о том, что атрибуты были изменены извне и что надо перестроиться.