Возможно, вы слышали о Флаттере в последнее время. Это довольно актуальная тема в мобильной разработке, в частности, в кроссплатформенной мобильной разработке.
«О, еще одно кроссплатформенное решение? Это становится похоже на все эти новые платформы JS», - подумаете вы. Это была моя первая реакция и, вероятно, реакция многих других.
Не судите слишком быстро, потому что Flutter не «другое решение».
Это новый подход.
Давайте посмотрим, как развивались кроссплатформенные мобильные разработки.
SDK для Android и iOS были опубликованы в 2008 году. Приложения, разработанные с помощью этих SDK, обычно называют «нативными приложениями». Уже в 2009 году появилось первое кроссплатформенное решение - PhoneGap . Возможно, вы слышали о Cordova , это в основном ядро PhoneGap с открытым исходным кодом.
Создание приложения с помощью Cordova похоже на создание приложения, которое является веб-браузером, который только открывает вашу страницу. Он не обеспечивает наилучшего пользовательского опыта, который может сделать нативное приложение, и поэтому Google и Apple не являются фанатами этих приложений, наводняющих их магазины.
Тогда есть Ionic , который использует Cordova в качестве ядра. Представленное в 2013 году, это лучшее, всестороннее решение с современными JS-средами. Недостатком является то, что он имеет те же ограничения.
Переходя к ...
В 2009 году мы также видим начало кроссплатформенной разработки другого рода. Примерно в то же время было представлено менее известное решение - Appcelerator Titanium . Вместо того, чтобы просто показывать все как веб-страницу, он может отображать собственные представления, как и собственные приложения.
Например, в Titanium вы можете писать <Label>Hello World</Label>
(да, вы можете писать на HTMLish), и это будет использоваться UILabel
на iOS и TextView
при работе на Android.
Сначала это выглядело великолепно. Вы пишете свой код один раз, и он работает как родное приложение на обеих платформах. Не зря другие решения решили использовать аналогичный подход.
Первым, кто последовал за этапами Titanium, был Xamarin в 2013 году (позже приобретенный Microsoft). После Xamarin в 2015 году вышел React Native . На момент написания этой статьи React Native является наиболее популярным кроссплатформенным решением.
Важно отметить, что React Native по-прежнему работает с JavaScript. Это означает, что его необходимо интерпретировать, а данные должны передавать мост от интерпретатора JS к собственной среде. Это приводит к снижению производительности. Если вы не знаете, что делаете, вы можете проходить этот мост каждый кадр, что может привести к пропущенным кадрам и рывкам.
В целом, решения нативной привязки не доказали, что они могут делать то, что хотят все кросс-платформенные разработки - написать код один раз и запустить его на нескольких платформах.
Это может работать для простых случаев, таких как привязка этого ярлыка в Titanium. Но для любого реального приложения привязки не всегда так просты, и в результате вы получаете возможность совместно использовать только часть бизнес-логики вашей кодовой базы и писать отдельный пользовательский интерфейс для каждой платформы.
Одним из примеров является хорошая старая кнопка. В Android нет свойства border, чтобы изменить его для кнопки. Вместо этого вам нужно использовать shape XML, поэтому вам нужно переопределить собственные представления или пользовательские средства визуализации, чтобы преодолеть это ограничение. Это было действительно сложно для Xamarin, который пытался поддерживать все виды платформ, кроме iOS и Android, такие как Windows Phone и Tizen OS.
Поэтому не только сложно, но и не рекомендуется писать интерфейс для двух платформ. React Native придерживается философии «Учись один раз, пиши где угодно», и это означает, что часто ты пишешь часть кода UI дважды для обеих платформ.
Xamarin также не рекомендуется для продвинутых приложений, которые требуют родного ощущения или пользовательского интерфейса:
И тут появился Флаттер . Не является частью веб-решений или решений с нативной привязкой, но совершенно отличается. Для начала, это фреймворк пользовательского интерфейса, и он не пытается заменить нативную разработку. Код не запускается отдельным интерпретатором, как это может сделать Javascript. Он скомпилирован в машинный код, как и нативные приложения.
Как в любом случае нативные приложения рисуют на экране? Ну, они все просто рисуют графические примитивы на холсте - думайте о крошечных линиях, кругах и прямоугольниках. TextView и UILabel рисуют текст на холсте и расширяют View или UIView.
Решения native-bind (React Native, Xamarin ...) имеют абстракцию на уровне представления, например, Label будет TextView или UILabel. Флаттер работает на другом уровне, холст абстрагируется. Когда вы используете текст, этот вид (или виджет, как он называется) перестраивается с нуля командой Flutter на этом новом абстрактном холсте. Это будет выглядеть одинаково в обоих приложениях, так как все операции холста работают одинаково.
Фактически, каждый компонент перестраивается с нуля на этом новом холсте. Это был единственный способ достичь истинного кроссплатформенного способа «писать один раз и работать везде».
Для команды Flutter это также означало, что им необходимо скопировать внешний вид нативных приложений в свои новые перестроенные компоненты. Например, Android TextView имеет 14 тыс. Строк кода, и все его поведение пришлось воссоздать с чистого холста в этом новом текстовом виджете. Каждый компонент, такой как кнопка, флажок, переключатель, панель приложения и даже прокрутка, копируются до пиксельного совершенства.
Можно сделать вывод, что рисование во Flutter - это то же самое, что делают устаревшие Adobe Flash или игровые движки, такие как Unity. Это правда, что они оба берут весь холст, а затем работают так, что могут запускать один и тот же код и рисовать на этом холсте (какой бы платформой он ни был).
Но они никогда не были о мобильных телефонах. Флэш-производительность была заведомо плохой, поэтому на iOS она была ограничена еще в 2010 году. Unity была запущена на настольных компьютерах и борется с ресурсами на мобильных устройствах.
Флаттер пришел как раз в нужное время. Идея компиляции в ARM и машинный код , LLVM-компилятор и использование движка Dart со всеми оптимизациями производительности и управлением памятью позволяет наконец достичь естественного внешнего вида на мобильных устройствах при однократной записи.
Он был в разработке в течение нескольких лет - в декабре 2018 года он достиг 1,0. Единственное, чего сейчас не хватает, так это широкого принятия.
Почти все разработчики слышали о React Native, но не так много слышали о Flutter.
Разница еще больше для тех, кто не занимается разработкой, таких как заинтересованные стороны. Поскольку индустрия говорит о native и React Native, они могут рассматривать Flutter как новую рискованную технологию. Но имейте в виду, React Native когда-то тоже был в этом состоянии. Если вам нужно больше, чем предчувствие, чтобы поверить, что 2020 год может стать годом, когда взлетит Flutter, вот кость, которую нужно пережевать - он уже прошел React Native в звездах на Github, что свидетельствует о большой популярности.