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

OSCHINA-MIRROR/CarGuo-GSYFlutterBook

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

Фестиваль Flutter | 2022 год

Привет, всем привет, меня зовут Го Шуйю, автор книги "Практическое руководство по разработке приложений с использованием Flutter" и ответственный за открытое программное обеспечение проекта GSY, таких как gsy_github_app_flutter и GSYVideoPlayer.

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

Состояние Flutter

Я начал работать с Flutter примерно в 2017 году. Это было забавно — тогда мне требовалось провести внутреннюю презентацию по технологиям кросс-платформенного программирования, главной целью которой было продвижение фреймворка React Native среди других отделов компании. К моему удивлению, именно тогда я наткнулся на Flutter и решил добавить его в качестве дополнительного элемента в свою презентацию. Так началась моя история с Flutter.

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

image-20220222115737486Как показывает эта диаграмма, на момент моего скриншота в феврале, Flutter имеет более чем 137 000 звёзд на GitHub, а также более 10 000 открытых и более 50 000 закрытых запросов на исправление ошибок, что свидетельствует о высокой активности сообщества и пользователей.

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

Как видно из этой диаграммы, согласно исследованию данных во второй половине прошлого года, Flutter занял первое место среди самых используемых и любимых кросс-платформенных фреймворков. Можно заметить значительный рост использования Flutter с 2019 по 2022 годы, где около 42% кросс-платформенных разработчиков используют этот фреймворк.

image-20220222115623672

image-20220222115549701

На самом деле, в последние два года я делал некоторые простые статистические исследования:

  • В 2020 году из 52 образцов 19 приложений использовали Flutter;
  • В 2021 году из 46 образцов 24 приложения использовали Flutter. Данные, полученные на основе анализа 57 популярных приложений в феврале 2022 года:| Flutter | React Native | Weex | Без использования кросс-платформенных технологий | | :----------------------------------------------------------- | :----------------------------------------------------------- | :------------------------------------------------- | :------------------------------------------------------------ | | 27 | 24 | 5 | 13 | | Лianjia, Zhuanzhuan, Juejin, китайская университетская платформа MOOC, Tonghuashun, Ele.me, Phoenix News, WeChat, WeiShi, Bilibili Comics, Tencent Classroom, корпоративный WeChat, учебный проект "учиться сильнее", Xianyu, Ctrip Travel, Tencent Meeting, Weibo, BeiJingZuFang, Baidu Yunpan, WPS Office, Vipshop, Meituan Zongbao, Meituan Waimai Shangban Ban, UC Browser, QQ (libmxflutter), Xiaomi Sport, Youku Video | Meituan, Meituan Zongbao, Meituan Waimai Shangban Ban, Meituan Waimai, IQIYI, китайская университетская платформа MOOC, Maimai, Xiaohongshu, Anjuke, Detu, 58Towns, WeChat Reading, Autohome, Lark, Himalaya, Qunar Travel, Cainiao, JD, Kuaishou, Ctrip, Mi Home, UC Browser, Xiaomi Sport, Youku Video | UC Browser, Xianyu, Weibo, Mi Home, Youku Video | NetEase Music, Boss Zhipin, Toutiao, FluentU, Zhihu, Tencent News, Finance Society, KuGou Music, Pinduoduo, Douyin, Qiandeng, What to Buy |> Эти данные были собраны из APK файлов Android, основываясь на наличие библиотек libflutter.so, libreactnativejni.so и libweexcore.so. В случае использования плагинов для распространения, некоторые приложения могут быть пропущены.

Как видно, использование Flutter и React Native составляет около 50%, тогда как доля Weex значительно ниже. Кроме того, на основе этой небольшой выборки можно заметить, что большинство современных приложений используют различные кросс-платформенные фреймворки.

При этом, выделенные жирным шрифтом приложения используют более одного кросс-платформенного фреймворка по причине бизнес-потребностей, такие как UC Browser, Xianyu и другие. Анализируя официальные данные за четвертый квартал прошлого года, можно отметить, что за последние шесть месяцев 72% и 91% разработчиков использовали Flutter для создания приложений для iOS и Android соответственно.

0*TERDonM4zc_kafRm

Рассмотрим ещё одну статистику, полученную с платформы pub.dev, которая является хостингом для сторонних пакетов Dart. Данные основаны на информации от 22 февраля 2022 года:

Все 23495 пакетов
Flutter 21714 пакетов
Android/iOS 20352 пакетов
Веб 12584 пакетов
ПК 14314 пакетов
Null Safety 12615 пакетов

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

0_Zw_zyVq5CfP7Y09o

И последнее, стоит упомянуть идею, которую всегда пропагандирует официальная команда Flutter:

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

Это текстовый редактор! По данным за четвертый квартал, удовлетворенность функциями редактирования текста упала с 82,3% (однострочный режим) и 82,2% (фильтрация и форматирование) до 69,6% (мультистрочный режим) и 66,6% (редактор с богатым форматированием). На текущий момент опыт работы с мультистрочным редактированием и поддержка ввода текста с богатым форматированием действительно не слишком удобны.## Flutter против других

Поговорив о текущем положении дел с Flutter, давайте обсудим некоторые очевидные сравнения между Flutter и другими фреймворками.

Реализация

Эта тема уже была затронута множество раз, поэтому мы кратко рассмотрим её. Во-первых, сравним принципы реализации каждого из этих фреймворков, как показано на следующих диаграммах:

  • Для нативного Android или Compose процесс рендеринга состоит из выполнения нативного кода через Skia до конечного этапа рендера на GPU. Напомню, что Android имеет встроенный Skia. Для Flutter контролы Dart-кода проходят через Skia и затем отрисовываются с помощью GPU; при этом в Android используется системный Skia, а в iOS — Skia, встроенный в проект.

Для React Native/Weex и подобных проектов контролы выполняются внутри своих движков JavaScript, а затем отображаются как native контролы с использованием native возможностей отрисовки.

Для uni-app и подобных гибридных кросс-платформенных фреймворков используются возможности отрисовки WebView; (не рассматривается случай использования Weex).

Сначала заметим, что теоретически Flutter наиболее близок к native реализации, так как путь его выполнения аналогичен native, в то время как RN/Weex несколько уступают, а uni-app использует отрисовку WebView и находится на последнем месте.Однако, когда дело доходит до производительности, на самом деле часто ограничивающим фактором является не сам фреймворк, а разработчик, который использует его. Я видел приложения, созданные с помощью Cordova, которые были очень хорошо оптимизированы по производительности и удобству использования. В одном из моих выступлений на конференции я говорил с представителем Alipay, который отметил, что компания также использует много технологий hybrid на основе H5, и благодаря собственному ядру UC они обеспечивают отличную производительность и опыт пользователя.

Размер сборки

Затем мы сравним размер сборки приложений, главным образом для Android, поскольку размер приложений для iOS всё реже становится предметом внимания, как это было с QQ:

image-20220225113714959

Возвращаясь к вопросу о размере приложений, ранее мне попались мнения многих людей:

"Compose использует Kotlin/JVM для создания JAR/AAR файлов для JVM и Android платформ, Kotlin/Native для создания Framework файлов для iOS платформы и Kotlin/JS для создания JavaScript файлов для Web платформы. В конечном итоге вызывается native API, что позволяет использовать Compose Multiplatform без потери производительности и без увеличения объёма приложения, как это происходит с Flutter."

Да, если судить по реализации, Flutter действительно должен занимать больше места по сравнению с Compose. Но какова реальная ситуация?Сначала создаем несколько пустых проектов, а затем при сборке оставляем только связанные с arm64-v8a динамическими библиотеками, так как обычно на устройстве остается одна такая библиотека .so.

Не добавляя ни одной строки кода, собираем release версию для Android и получаем следующие результаты:

  • Реакт Натив имеет самый большой размер пустого проекта, основной объем которого приходится на различные динамические библиотеки внутри него, такие как JSCore;
  • Флаттер занимает второе место, его основной объем также связан с внутренними динамическими библиотеками, такими как фреймворк Flutter;
  • Размер проекта Compose очень близок к размеру нативного Android, основной объем которого приходится на файлы classes; конечно, здесь нет минификации и сжатия, после которых размер может значительно уменьшиться.

Из полученного результата видно, что пустой проект Flutter действительно больше по объему, чем проект Compose. Однако стоит обратить внимание на следующие моменты:

  • При использовании чисто Flutter-разработки основной объем приложения будет зависеть от файла libapp.so, который представляет собой native двоичный код, скомпилированный методом Ahead-of-Time (AOT);
  • Основной объем увеличения в случае Compose зависит от файлов classes, где увеличение объема кода возможно благодаря минификации и сжатию.Кроме того, многие могут интересоваться процессом компиляции Compose и тем, как она выполняет отрисовку интерфейса.

Вкратце, контроллеры Compose и нативные контроллеры представляют собой различные системы. Если вы посмотрите на скомпилированный код, то заметите, что контроллеры типа BOX в конечном итоге реализуются через фреймворк ComposerKt и BoxKt для выполнения отрисовки и рисования.

Поэтому после компиляции Compose не преобразуется в нативные Android View для отображения, а использует платформенный Canvas, что делает его похожим на Flutter. Можно сказать, что Compose представляет собой новую систему View.

Кроме того, стоит отметить, что хотя это и новая система View, компоненты Compose могут отображать границы интерфейса на устройствах Android.

Что касается объема, поскольку у меня есть ряд открытых проектов GSY, которые имеют схожую бизнес-логику, мы можем сравнить их размеры после сборки в режиме release.

  • Flutter

ld53439aaeae21568253c98480767caee-s-m1c224ff23fb985b1bded376f0cceebdc

  • React Native

lca0d0a439e3b9d18d0195521fad90c14-s-m7fdc781bd60e584b0c161115fa824f43

  • Нативный Android

le2f6c0258c501a6fdae93b47deff024c-s-mc5ea88d982f7d79299b1b0391b7e95ab

Поскольку у меня пока нет проекта с использованием Compose, здесь представлен сравнительный анализ нативной реализации.- Проект Flutter увеличился с пустого размера в 5,7 МБ до 9,8 МБ, что составляет прирост в 4,1 МБ;

  • Проект React Native увеличился с 9,4 МБ до 12,7 МБ, что составляет прирост в 3,4 МБ;
  • Нативный проект увеличился с 3,2 МБ до 9,3 МБ, что составляет прирост в 6,1 МБ.

Хотя это не совсем точные данные, можно заметить, что при примерно одинаковых бизнес-ценностях общая величина проектов Flutter и нативного приложения отличается не сильно, а прирост размера нативного проекта даже больше, чем у Flutter.

Однако данное утверждение справедливо при условии, что нативный проект не использует компрессию и минификацию. При активации этих процессов, как показывают следующие графики, объем приложения значительно уменьшается — от 9,3 МБ до 6,4 МБ. Таким образом, можно сделать вывод, что после применения минификации и компрессии, прирост размера нативного приложения будет сравнимым с приростом размера Flutter.

image-20220223172138586

Кроме того, я нашел проект на чистом Compose и провёл тестирование после применения минификации и компрессии. В результате объём Compose значительно уменьшился: с 9,6 МБ до 2,4 МБ, благодаря тому, что большинство классов в Compose могут быть успешно минифицированы.

image-20220223170138121 image-20220223170242884Итоги:

  • При применении минификации, объём Compose действительно меньше, чем у Flutter, преимущество заключается в более эффективной минификации классов;
  • Объём React Native обычно больше, чем у Flutter; аналогично, Weex также имеет больший объём.

Конечно, это не абсолютное правило, поскольку размер приложения может зависеть от привычек разработчиков. Например, однажды мне попался случай, когда библиотека бизнес-логики Flutter одного приложения достигала 77,4 МБ.

lb47319abc6776b6ac76d45775ecfa7e8-s-m0f2c227b7d605d6930401a084bd16170 Это какое понятие? Обычно, размер Flutter динамической библиотеки для обычной средней или маленькой приложения составляет около 10 МБ - 15 МБ, а для крупных приложений обычно контролируется в диапазоне от 20 МБ до 35 МБ. Даже если это очень большой объём, например, UC составляет 35 МБ, а корпоративный WeChat — 28,9 МБ.

lf6f59898fbe0c6b11639e81c92796155-s-m5f015f612b387f867b36de285a780d88

le0e42c9311522a26d2a83afda916b3db-s-m1548598cff0bb0080caf643514588d90

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

Давайте поговорим о процессе сборки. Почему мы говорим об этом? Потому что для новичков проблемы во время сборки могут стать причиной отказа от дальнейшей работы.

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

l9d17062e9171bfc73b423f52f22bae27-s-m908dc799447e36c1a7c8ca7275416992

Если после запуска вы видите, что процесс застрял на этапе assembleDebug, то это значит, что Android скачивает необходимые зависимости через интернет, такие как Gradle SDK и AAR библиотеки. Этот процесс не отображается при выполнении команд flutter run или запуске через IDE. Чтобы увидеть прогресс, вам нужно будет перейти в директорию android/ и выполнить команду ./gradlew assembleDebug.

Например, в официальном опросе Flutter Q4 было установлено, что самыми распространенными проблемами при выпуске приложений являются работа с Xcode (для iOS) и Gradle (для Android). Почему это важно? Во-первых, это указывает на то, что недостаток знаний о нативных платформах может стать болезненной точкой использования кросс-платформенного программирования.

0_3MXILeNbFbIFagLu

0_qtLcSyZO68tuY6GkКонечно, среди всех кросс-платформенных решений Flutter хотя бы не является худшим, но React Native точно можно назвать самым слабым звеном. Независимо от того, используете ли вы Weex или React Native, проблема с node_modules всегда была головной болью. image-20220223173738326Пример: черная дыра node_modules в проектах React Native часто приводит к непредвиденным проблемам при установке и запуске в различных окружениях. Различные плагины и инструменты становятся источниками проблем, особенно когда они делают проект более громоздким. Вот пример проблемы, с которой я столкнулся недавно:

l44f7689357e4deb77b7c5019177f3442-s-m2fc075a1dd990c3aaabc19acb201f279

lc29a1742b1876eea0deee1c895d05a1a-s-m1d64d4caf0ea69d9a76e350e370f46de

Зависимости внутри зависимостей требуют разных версий среды Node.js, что заставляет меня находить подходящую версию среди всех этих вариантов. Конечно, это ещё не самое сложное. Самое сложное — это когда проект успешно запускается на компьютере А, а затем на компьютере Б после выполнения команды npm install, он отказывается работать. Это обязательный урок для каждого разработчика React Native.

Из точки зрения фронтенд-разработки, использование плоских зависимостей может сделать структуру зависимостей менее очевидной, так как количество файлов и директорий становится значительным. Однако современные инструменты управления зависимостями, такие как npm и pnpm, уже внедрили оптимизации для решения этой проблемы,в то время как Flutter гораздо легче в этом отношении. В настоящее время уровень вложенности пакетов Dart очень мал, и пути к этим пакетам достаточно понятны. Именно поэтому мне кажется, что Flutter намного удобнее React Native в этом плане, поэтому при одинаковой сложности зависимости от платформы, Flutter действительно проще начинать работу с "Hello World", чем React Native.### Flutter & Compose

И последний момент: сравнение между Flutter и Compose.

Многие уже видели сравнение между Flutter и React Native, поскольку React Native существует уже давно, и эти технологии поддерживаются различными компаниями. Но что касается Flutter и Compose, они являются открытыми проектами Google и поддерживают многоплатформенный подход. Какие же различия между ними? Какой выбор стоит сделать?

Сначала немного отступлю от темы: фронтенд использует npm, Flutter использует pub, iOS использует CocoaPods, вы можете найти нужные библиотеки через официальные сайты этих систем, просмотреть информацию о популярности, версиях, совместимости и количестве использования. Но что насчет Android?

Неужели система сборки Android Gradle не имеет такого удобства, чтобы мы могли просто искать нужные библиотеки через ключевые слова на GitHub? Этот пробел влияет на развитие Compose в контексте многоплатформенного программирования. Сначала официальное определение от Google, Compose — это современный нативный пакет инструментов пользовательского интерфейса для Android, и как мы уже говорили ранее, это новая система UI, поэтому Compose имеет свою платформу, а именно Android, где он работает в своей среде.

Из доступной дорожной карты видно, что Google сосредоточил свои усилия на нативной платформе Android, а реализация Compose Multiplatform осуществляется командой JetBrains через compose-jb.Flutter не имеет своей собственной платформы, он представляет собой кросс-платформенную систему пользовательских интерфейсов, созданную специально для работы на нескольких платформах. На данный момент Flutter поддерживает официально Android, iOS, Web и Windows, а поддержка Linux и macOS находится в процессе разработки.

Поэтому одной из главных отличий между ними является то, что Compose был спроектирован Google для создания нового UI для Android, а JetBrains расширили его возможности до кросс-платформенного использования, тогда как Flutter был создан с целью работы на множестве платформ.

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

image-20220223174643400

Основное различие заключается в том, что Flutter использует единую официальную библиотеку для поддержки различных платформ, в то время как Compose пока использует различные модули для поддержки разных платформ.

Flutter, конечно же, компилируется с использованием различных команд для каждой платформы, при этом используется общая библиотека Flutter для выполнения задач. В настоящее время логика реализации Compose для Web, Desktop и Mobile может не совпадать, особенно для Web.> В настоящее время официальная поддержка Compose для iOS ещё недоступна, хотя существуют способы её использования, но они пока не очень удобны. Для Web Compose требуются специальные пакеты, которые отличаются от тех, что используются для Mobile и Desktop, где можно использовать общий набор compose-ui.Например, в compose-jb поддержка Web реализуется следующим образом, как видно из импортируемых и используемых компонентов:

import org.jetbrains.compose.web.dom.*
import org.jetbrains.compose.web.css.*

fun main() {
    var count: Int by mutableStateOf(0)

    renderComposable(rootElementId = "root") {
        Div({ style { padding(25.px) } }) {
            Button(attrs = {
                onClick { count -= 1 }
            }) {
                Text("-")
            }

Поэтому с точки зрения Compose:

  • Compose — это новый UI-контейнер в серии Jetpack, который主要用于Android界面开发,目的是重新定义Android平台上UI的编写方式。因此,您可以选择是否使用它,无论使用与否都可以进行Android UI开发。但如果要在Android领域深入发展,最好还是要学会Compose
  • Будущее Flutter заключается в создании надёжной и стабильной многоплатформенной UI-библиотеки. Если ваш путь развития не связан с многоплатформенным подходом, то знание Flutter может быть необязательным.

С практической точки зрения, независимо от того, начали вы изучение с Compose или Flutter, это поможет вам освоить другую технологию. Учеба одной технологии даёт около 70% понимания другой:

  • Если вы являетесь native-разработчиком и ещё не знакомы с Flutter, лучше всего начать с изучения Compose. Это будет полезно для вашего карьерного пути в Android, а затем переход к Flutter будет легче.
  • Если вы уже используете или изучаете Flutter, продолжайте углубляться в него. Не стоит прекращать обучение из страха пропустить Compose. Когда вы освоите Flutter, до Compose будет недалеко.> После сравнения дизайна и архитектурных решений Flutter и Compose можно сказать, что они очень похожи по реализации.

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

Некоторые мысли

Наконец, давайте обсудим некоторые мои мысли.

Подробности многофункциональности

До появления Flutter, основные принципы мобильной многофункциональности сводились к двум вариантам:

  • использование WebView для многофункциональности;
  • использование прокси-контроллеров для многофункциональности;Поэтому ранние мобильные многофункциональные компоненты, такие как Cordova и Ionic, были направлены на расширение способностей фронтенд-разработки HTML5 до мобильных приложений, позволяя фронтенд-разработчикам легко создавать Android и iOS приложения. В те времена слоган был таким: "Напиши один раз, запусти везде". Позже, благодаря популярности React, React Native открыл новую логику: писать нативные приложения с использованием методов фронтенд-разработки, преобразуя компоненты JavaScript в нативные компоненты для рендеринга. Это позволило повысить производительность мобильных кросс-платформенных приложений, выйдя за рамки ограничений WebView. Основной принцип React Native заключается в том, что учишься один раз, пишешь везде, то есть если ты знаешь React, ты можешь создавать как веб-приложения, так и мобильные приложения.А когда дело дошло до Flutter, он полностью освободился от зависимости от платформенных компонентов, создав собственный набор независимых от платформы компонентов, который рендерится напрямую через GPU. Такой подход имеет самое высокое затратное соотношение, но привносит "расплетение" и "то, что видишь, то и получаешь", что является лучшим решением. Кричка Flutter звучит как Создайте приложения для любого экрана.

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

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

Горячие обновления

Раз уж мы говорим о горячем обновлении, давайте кратко рассмотрим проблему горячего обновления. Во-первых, официальная поддержка горячих обновлений от Flutter отсутствует, в отличие от React Native, который предлагает очень зрелый и универсальный фреймворк code-push.> Почему? Во-первых, код JavaScript в React Native представляет собой чистый текстовый скрипт; даже если он собран в бандл, он остаётся в виде чистого текста. Поэтому отправка текстового бандла через code-push не противоречит правилам, а code-push не может отправлять собранный нативный код, поскольку это было бы некорректным.

Когда Flutter собирается с помощью AOT, получается исполняемый двоичный файл. Отправка такого файла через механизм горячего обновления будет нарушать правила Apple App Store и Google Play.

Можно ли делать горячие обновления в Flutter?

Ответ — да, можно. Учитывая необходимость горячих обновлений в Китае, появились различные сторонние решения, такие как:

MxFlutter (Tencent), Fair (58.com), liteApp (WeChat Work), Flap (Meituan MTFlutter) и flutter_code_push (Chimera).

Эти решения не отправляют собранный двоичный код напрямую; например:

  • MxFlutter использует JS/TS для написания компонентов и выпуска обновлений;
  • liteApp принимает ввод с использованием шаблонов Vue;
  • Flap выполняет обработку DSL и процесса кодирования на Dart для выпуска обновлений.

Эти подходы требуют некоторых жертв ради горячего обновления, поэтому с точки зрения Flutter всегда был "недружелюбен" к этому вопросу.

Конечно, если вы не публикуете приложение на Google Play, то горячее обновление SO динамической библиотеки на Android не является значительной преградой, так что вы можете использовать уже существующие плагины для решения этой задачи.### Кросс-платформенные возможности

Наконец, хочу сказать несколько слов о многоплатформенной поддержке Flutter. Вспомните ли вы ранее упомянутую фразу "Создайте приложения для любого экрана"? А Flutter — это же Write Once, Run Everywhere, верно? Официально поддерживаются сборки для Android, iOS, Web, Windows, MacOS и Linux всего за один набор кода?

Из моего опыта могу сказать, что идея "Write Once, Run Everywhere" звучит замечательно, но на практике она далека от реальности. Да, Flutter действительно позволяет запустить один и тот же код на всех платформах, однако текущий опыт показывает, что затраты времени и усилий на адаптацию одного кода ко всем платформам значительно выше того удобства, которое они предоставляют.

Давайте начнём с Web. Web-платформа среди всех остальных наиболее специфична, поскольку ей требуется поддерживать логику работы как на мобильных устройствах, так и на ПК. На данный момент Flutter Web:

  • Использует HtmlCanvas для отображения на мобильных устройствах, что приводит к проблемам с интеграцией и адаптацией API;
  • Использует CanvasKit для отрисовки на ПК, но технология wasm пока слишком "революционна", что вызывает проблемы с размерами, SEO и совместимостью;

**Поэтому использование Flutter Web на данный момент ещё не совсем удобно, хотя его стабильные версии имеют значение именно потому, что ваш код может быть собран в виде web-приложения!**После создания приложений для Android и iOS вы сможете быстро создать веб-страницы для части вашего пользовательского интерфейса (UI) и бизнес-логики, что делает этот подход ценным. Таким образом, вам совершенно не обязательно реализовывать эти части заново.

Например, проекты Ali Seller, Meituan Waimai Classroom и другие используют Flutter Web.

Перейдём теперь к ПК. Логика работы приложений на ПК отличается от мобильных устройств: мышь, клавиатура, возможность изменения размера окна, поворот экрана, прокрутка и прочее. Эти аспекты сложно объединить одним кодом. По моему мнению, лучше всего использовать те же компоненты, анимации, UI, списки и бизнес-логику, которые работают на Android и iOS, и применять их там, где это возможно. Если вам нужна хорошая производительность, я бы рекомендовал разделить проекты для ПК и мобильных устройств. Если действительно требуется одна общая система, есть некоторые хорошие поддержки, такие как: responsive_framework.

image21

image22

Опубликовать ( 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