Стили против модификаторов

Стили отличаются от модификаторов по своей сути. Стили не заменяют модификаторы; вместо этого две системы сосуществуют, преследуя разные цели. Внутри себя стиль является модификатором. Вы можете делать все то же, что и с помощью модификаторов, но не вся функциональность модификаторов доступна в стилях.

Ниже приведено сравнение стилей и модификаторов:

Особенность Модификаторы Стили
Основная цель Определяйте поведение, семантику и сложные макеты. Модификаторы изменяют отдельные элементы на лету для конкретного составного элемента и не передаются из темы оформления. Определяйте визуальное оформление, размеры отдельных элементов и свойства, изменяемые в зависимости от темы. Стили работают на уровне темы и могут быть переопределены на уровне компонента. Они распространяются и применяют стили к различным составным элементам.
Логика Аддитивный эффект — модификаторы объединяются, образуя новый результат. Переопределяемые свойства — побеждает последнее заданное свойство в стиле. Стили действуют как единый слой свойств, которые переопределяют друг друга на основе определенной иерархии приоритета.
Тематическое оформление Сложно включить в общую тему, обычно это делается отдельно. По своей конструкции стили можно изменять по темам (они могут обращаться к CompositionLocal ) и определить один раз, а затем использовать во всех компонентах.
Производительность Для обновлений часто требуются все три этапа Compose: композиция, компоновка и отрисовка. Для достижения хорошей производительности анимации модификаторов часто требуется написание версий на основе лямбда-выражений. Пропускает фазу композиции, активен только на этапах компоновки и отрисовки, что уменьшает количество перекомпозиций. Требует меньшего выделения объектов.
Анимации Требуется использование отдельных примитивов анимации, таких как animate*AsState Встроенный API animate { } позволяет обрабатывать некоторые анимации.

Ограничения модификаторов

В современном интерфейсе Compose модификаторы обладают множеством преимуществ. Однако стили устраняют некоторые ограничения модификаторов, которые описаны в следующем списке:

  • Модификаторы обычно создаются на этапе композиции. Обновления могут привести к полному повторному запуску этапов композиции, компоновки и отрисовки, даже при небольших визуальных изменениях, таких как цвет, если вы не создадите модификаторы на основе лямбда-функций.
  • Условные модификаторы требуют сложной логики if-else внутри цепочек текучих процессов. Анимация требует ручного написания шаблонных состояний и не имеет высокопроизводительного механизма «автоматической анимации».
  • Модификаторы накладываются друг на друга, а не заменяют. Вы не можете переопределить границу компонента по умолчанию; вы можете только нарисовать вторую границу поверх неё.
  • Модификаторы сложно абстрагировать в глобальные темы. Следовательно, темы обычно хранят необработанные значения, а не многократно используемые конфигурации модификаторов.

Ограничения стилей

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

  • Стили — это специализированные модификаторы. Хотя модификатор может делать всё то же, что и стиль, обратное неверно. Следовательно, стили могут дополнять, но не заменять модификаторы.
  • Стили ограничены визуальной настройкой (фон, отступы, границы). Они не могут обрабатывать такие действия, как логика кликов, распознавание жестов или семантика доступности.
  • Преобразование стиля в его окончательное состояние обходится дороже, чем применение одного модификатора . Система должна сгенерировать структуру данных, содержащую все возможные значения свойств, а поиск унаследованных свойств еще больше усложняет этот процесс.

Когда следует использовать стили вместо модификаторов?

Хотя выбор в пользу использования стилей во многом зависит от вашего приложения и сценариев использования, следующие рекомендации помогут определить, когда следует отдать предпочтение стилю перед модификатором:

  • Для достижения единообразия во всей теме: стили разработаны таким образом, чтобы их можно было «перенести» в глобальную тему. Вместо того чтобы передавать повторяющиеся модификаторы каждому компоненту, вы можете определить один стиль в своей теме, чтобы создать единый внешний вид для всего приложения.
  • При выполнении частых анимаций: стили оцениваются на этапах компоновки и отрисовки, что позволяет анимировать такие свойства, как цвет или масштаб, полностью минуя этап композиции. Это значительно снижает накладные расходы на производительность. Используйте стиль вместо модификатора при анимации визуальных свойств.
  • Переопределение против наложения: используйте стили, когда вам нужно заменить свойство по умолчанию. Модификаторы являются аддитивными (добавление границы накладывает вторую), тогда как стили используют логику «последний добавленный элемент имеет приоритет», что упрощает замену фона или отступов без визуального беспорядка.
  • Настройка компонентов Material: Если компонент Material предоставляет параметр Style, это рекомендуемый подход к настройке. Эти стили позволяют получать доступ к определенным свойствам внутренней структуры составного элемента и изменять их, что в противном случае могло бы быть недоступно.