1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/CarGuo-GSYFlutterBook

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
Z3.md 30 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
Отправлено 10.03.2025 00:06 5767d61

Выбор фреймворков для инженерилизации Flutter — повышение производительности UI

Эта статья является эксклюзивной публикацией сообщества технологий XiTu JueJin и запрещена для перепечатки в течение 14 дней. Без специального разрешения перепечатка запрещена в течение 14 дней после публикации, нарушители будут преследованы!

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

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

Как разработчики фронтенда, наша основная задача заключается в создании UI, однако если кто-то уже подготовил UI за нас, это было бы замечательно? На самом деле, во многих случаях UI действительно можно сделать шаблонным, а в области фронтенд-разработки это всегда было так. Например, Ant Design, Element-UI и прочее. А что насчет Flutter?

Ответ однозначно положительный, но перед тем как мы начнем говорить о них, давайте сначала обсудим проблему Flutter UI: вложенность.> Чтобы стать менее поверхностным, мы обсуждаем технологии в начале, а затем рекомендуем проекты.

Введение — Вложенность UI

Когда речь заходит о Flutter, многие начинают говорить о вложенности. Да, Flutter использует вложение widgets для отрисовки UI, поэтому некоторые могут жаловаться на следующий код, хотя этот код не имеет практического значения, нам стоит задуматься над двумя вопросами:

  • Страшится ли Flutter влияния вложенного widget на производительность?
  • Есть ли у Flutter способов решения проблемы вложенности?

image

Сначала отметим, что обычно Flutter не боится влияния вложенного widget на производительность, потому что "все знают", что widget в Flutter не являются настоящими компонентами управления, а скорее конфигурационными файлами. Настоящие объекты отрисовки и размещения находятся за ними, такие как render object.

Причина большого количества уровней вложенности заключается в том, что widget имеют слишком мелкий размер.

Однако это зависит от того, что делает ваш вложенный widget. Или другими словами, что делает render object вашего вложенного widget.

Например:- RenderPadding в Padding выполняет вычисление Size и childParentData.offset при размещении.

  • _RenderColoredBox в ColoredBox добавляет одну операцию drawRect.
  • RenderPositionedBox в Align выполняет вычисление childParentData.offset. Поэтому эти Widget имеют очень мелкую гранулярность, но при этом они легкие, и когда мы используем их непосредственно, мы можем столкнуться с тем, что они будут вложенными друг в друга слоями, что может выглядеть некрасиво, но фактический эффект производительности при рендере будет минимальным.> Однако это не относится ко всем Widget, некоторые из них могут быть тяжелыми и чувствительными к вложенным структурам, например Clip, Transform и Opacity. В случае использования методов, таких как pushLayer, если требуется выполнение операций слияния слоев, то влияние на производительность действительно будет значительным.

И второй вопрос — как решить проблему вложений? Для этого вам потребуется "шаблон конфигурации", который позволяет оптимизировать структуру кода через упаковку различных компонентов.

Что такое "шаблон конфигурации"? Давайте рассмотрим пример: вы, вероятно, использовали Container? Container представляет собой шаблон, подготовленный командой разработчиков Flutter для удобства использования. Он сам является простым StatelessWidget, то есть Widget без RenderObject, и он полагается на комбинацию различных Widgets для своей работы. Ниже приведены сравнительные снимки экрана использования Container.

Поэтому при создании пользовательского интерфейса с помощью Flutter можно говорить о следующих двух аспектах:- Widget служит в качестве конфигурационного файла, обычно он легкий и не боится вложений, так как реальная отрисовка происходит за счет RenderObject.

  • Оптимизация структуры кода с помощью различных шаблонов конфигураций пользовательских интерфейсов, особенно абстрагируясь от шаблонов, подходящих для конкретной бизнес-логики.Допустим, вот пример использования стороннего открытого пакета для размещения dashboard. В такой сложной структуре пользовательского интерфейса можно ли просто использовать вложения Column и Row? Ответ очевидно отрицательный!

Пакет dashboard использует шаблон, состоящий из Stack и Positioned, чтобы вычислить положение элементов при перемещении руками, а также реализовать анимацию смещения с помощью AnimatedBuilder.

На самом деле можно использовать AnimatedPositioned. Подробнее см. «Flutter хитрости: интересные приемы анимации». Так что можно заметить, что в Flutter вы можете избежать глубоко вложенного кода, это зависит от вашего способа упаковки. Кроме того, есть возможность создания кастомной логики размещения прямо на уровне RenderObject, как показано ниже:

облако кастомная множественная рендера
image-20220922120414245

Конечно, некоторые проекты используют альтернативные подходы, например, никю использует typedef и абстрактное расширение для вторичной обёртки официальных компонентов, тем самым создавая "необычный" UI, который представлен на следующих изображениях. Нравится или нет — дело вкуса, но этот подход действительно помогает решить проблему визуализации вложений.

Автор является любителем анимэ, но судя по адресу, он скорее всего из Таиланда.

Основная цель нашего выпуска — повышение производительности UI, поэтому мы не будем углубляться в детали реализации кода. Основное внимание уделим второй части материала.

UI компонентыВ области фронтенд-разработки использование единого набора UI компонентов позволяет увеличить скорость разработки и минимизировать трения между разработчиками и дизайнерами, а также обеспечивает единый стиль. Обычно внутри компаний такие компоненты накапливаются постепенно, образуя библиотеку компонентов, которая затем используется как набор UI компонентов. Например, Beike's bruno, которую можно сравнить с Element-UI для Flutter, уже поддерживает Flutter 3. Как один из немногих проектов Flutter UI, поддерживаемых крупной китайской компанией, она также предоставляет руководство по дизайну Sketch и материалы для скачивания.

Название GitHub GitHub GitHub
bruno bruno getwidget fsuper

На самом деле, для индивидуальных разработчиков такие наборы решают множество проблем дизайна.

Кроме того, стоит упомянуть о fluttercandies — организации, состоящей из экспертов, которые поддерживают ряд открытых проектов на Flutter. Это действительно эксперты, и они постоянно обновляют свои работы:

Например, если фреймворк Flutter не может решить определенную задачу в ближайшее время, то эксперты создают свой компонент и поддерживают его самостоятельно. Вот что такое fluttercandies.

ПКРаз уж мы говорим о UI для Flutter, то стоит упомянуть и о стилях UI для ПК, так как Flutter не ограничивается только Android и iOS, он также поддерживает Web и ПК. Поэтому стили UI для ПК тоже заслуживают внимания, например, проект ant_design_flutter представляет собой интересный подход.| fluent_ui | macos_ui | ant_design_flutter |

| ----------------------------------------------------------- | ----------------------------------------------------------- | ------------------------------------------------------------ | | | | |## Адаптивность

Некоторые могут спросить, можно ли иметь один набор кода, который будет адаптироваться под различные размеры экранов разных платформ? Ответ однозначно положительный, ниже представлены несколько пакетов, которые предлагают динамическое соответствие одного набора кода для различных размеров экранов. Я сам предпочитаю использовать ResponsiveFramework.

ResponsiveFramework responsive_sizer flutter_adaptive_ui

AppBar

Реализация такого типа AppBar является одной из самых часто задаваемых мной вопросов. В основе её лежит компонент Sliver, и строго говоря, мне кажется, что использование сторонних библиотек здесь не обязательно, так как можно реализовать это самостоятельно с помощью Sliver. Однако, руководствуясь принципом "не трогай, если не надо", я всё же рекомендую несколько библиотек:| draggable_home | extended_sliver | scroll_app_bar | | ---------------------------------------------------------- | ------------------------------------------------------------ | ------------------------------------------------------------ | | | | |> gsy_flutter_demo также предоставляет несколько подходов к реализации, что на самом деле совсем не сложно.## Навигационное меню

Кто-то может подумать, что навигационное меню требует использования сторонней библиотеки?

И действительно, такое мнение распространено, поскольку иногда требуется использование другого эффекта анимации. Здесь также упоминается sidebarx, который имеет схожие возможности с официально предоставляемым NavigationRail, позволяющим адаптироваться к многоплатформенным операциям пользователя.

sidebarx flutter_advanced_drawer curved_drawer

Вкладка

Раз уж мы говорим о навигационном меню, то и вкладка предлагает несколько интересных вариантов анимации, особенно при переходах между вкладками. Также стоит отметить библиотеку tab_container, которая использует Path для создания анимации фона.

flutter-cupertino-tabbar tab_indicator_styler tab_container

При рассмотрении вкладок, следует упомянуть и нижнюю панель. Здесь представлено несколько библиотек, которые предлагают интересные варианты анимации. Я сам предпочитаю такие криволинейные анимации.| curved_navigation_bar | salomon_bottom_bar | bubble_bottom_bar | | ------------------------------------------------------------ | ------------------------------------------------------------ | ------------------------------------------------------------ | | | | |## Указания

Для запуска указаний этого требования обычно достаточно одного компонента PageView, но иногда может потребоваться добавить немного анимационного эффекта, чтобы повысить KPI. Поэтому этот материал может пригодиться вам, хотя вы также можете использовать его как обычный PageView.

concentric_transition nice_intro intro_views_flutter

Окна уведомлений

Этот раздел требует минимальных пояснений, так как большинство приложений используют окна уведомлений. Эти два пакета покрывают около 90% сценариев.| flutter_badges | corner_decoration | | ------------------------------------------------------------ | ------------------------------------------------------------ | | | |

Анимированные кнопки

Обычно такие сложные эффекты не требуются, но что делать, если потребуется? В стиле Material Design таких взаимодействий немало, хотя в Китае Material Design особо не ценят.

flutter_animated_button progress_state_button

Профильные изображения

Не ожидаешь такого? Почему ещё нужен пакет для профильных изображений?

На самом деле это связано с последней ситуацией, которую многие знают. Когда есть социальные запросы, часто требуется такой вид UI, аналогичный тому, который используется на JiGuang Feidian.

avatar_stack overflow_view

Свайп-карточки

Этот запрос может быть не нужен большинству людей, но его рекомендую, поскольку помню случай несколько лет назад, когда мне заплатили 1000 за создание такого внешнего вида.| swipe_deck | swipeable_card_stack | appinio_swiper | | ------------------------------------------------------------ | ------------------------------------------------------------ | ------------------------------------------------------------ | | | | |

Нижний лист

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

we_slide sliding_up_panel

Интерфейсы с временной шкалой

Это один из самых часто задаваемых вопросов в наших группах, и я не могу понять, почему так много приложений используют такой тип интерфейса? Однако такие требования могут быть трудоемкими для самостоятельной реализации.| timeline_tile | timelines | | ------------------------------------------------------------ | ----------------------------------------------- | | | | Хорошо, относительно содержания, связанного с Flutter UI, рекомендации заканчиваются здесь. Основной целью данной статьи было помочь вам понять архитектуру UI в Flutter, а также предоставить способы решения проблем с вложенностью и некоторые интересные сторонние пакеты, чтобы повысить вашу производительность при разработке UI.Наконец, если у вас есть ещё вопросы по проектам или фреймворкам Flutter, мы приветствуем ваши комментарии и отзывы — возможно, это приведёт к появлению новых материалов!

Опубликовать ( 0 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/CarGuo-GSYFlutterBook.git
git@api.gitlife.ru:oschina-mirror/CarGuo-GSYFlutterBook.git
oschina-mirror
CarGuo-GSYFlutterBook
CarGuo-GSYFlutterBook
master