Evrone
3 954

Об опыте разработки на Dart

Как мы успешно создали медицинский сервис на новой для себя технологии.

В закладки

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

От заказчика поступила задача на разработку приложения, которое позволяет более качественно построить общение между врачами и их пациентами. Идею создания этого стартапа продиктовала ему жизнь.

У нашего клиента серьёзно заболел отец. Семья тонула в огромном объеме информации о возможном лечении. Чтобы не упустить важных деталей во время консультаций, разговоры с врачами записывались на диктофон. Записи рассылались по электронной почте членам семьи для обсуждения и принятия решения о лечении. Такой подход для формирования «команды здоровья» оказался весьма эффективным и у нашего заказчика созрела идея создать приложение, которое автоматизирует все процессы.

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

Чтобы помочь отцу заказчика и всем другим людям в подобной ситуации, и был создан Medcorder.

Выбор технологий

Нам предстояло создать концепт приложения, его дизайн и разработать MVP.

Заказчик предложил использовать стек Google (Google Cloud, Google Firebase, Google Storage, Google Speech Recognition) и новый инновационный кроссплатформенный фреймворк для разработки мобильных приложений — Google Flutter.

Знакомство с Flutter

Flutter — это достаточно молодой SDK от Google с открытым кодом для создания мобильных приложений под IOS и Android. Используется язык Dart, который компилируется в бинарный платформенный код, и за счет этого приложения показывают высокую производительность.

До проекта Medcorder у нас был большой опыт разработки на React Native, поэтому идею создать продукт на мультиплатформенном фреймворке мы посчитали очень удачной. Заказчику была важна скорость реализации и гибкость к изменениям, поэтому фреймворк – это то, что нужно.

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

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

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

  • Flutter for Android developers
  • Flutter for iOS developers
  • Flutter for React Native developers
  • Flutter for Xamarin.Forms developers
  • Flutter for Web developers

Это помогает провести аналогии, на живых примерах настроиться на новый лад.

За время разработки Flutter прошел путь от Pre-alpha до Release Candidate, который вышел в начале декабря 2018 года. Апгрейд на новые версии инструментария проходил достаточно сложно. И здесь нам очень пригодился опыт создания нативных мобильных приложений, так как разрешить некоторые зависимости можно было только хорошо понимая работу Gradle для Android и CocoaPods для IOS.

Сообщество и решение проблем

Из-­за молодости SDK возникало много проблем, в которые приходилось глубоко вникать. Сперва мы придумывали решения сами, но ситуация с сообществом менялась в лучшую сторону прямо на глазах.

Сообщество росло, многие ответы появлялись на Stack Overflow, или прямо в Issues на GitHub. Выходили новые модули и плагины, в том числе официальные от Google. Проблемы стало решать намного проще.

Интерфейс

Из коробки Flutter поддерживает 2 базовых варианта: компонент Material Design Widgets и Cupertino Widgets (виджеты в стиле iOS). Наш интерфейс был ближе к Material, поэтому от него и отталкивались.

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

Этапы разработки

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

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

Сейчас мы приступили к разработке версии платформы 2.0 и скоро выпустим ее.

Open Source

Очень радует, что Flutter — это open source. А значит, количество готовых решений увеличивается и их можно будет использовать в своих проектах. Мы уже внесли свой вклад.

В самом начале работы над проектом готовых плагинов для записи и проигрывания аудио еще не было. Мы создали свой на Objective C (iOS) и Java (Android).

Наш плагин Custom Audio Plugin теперь доступен для всех.

Где найдет применение Flutter

Прежде всего мы рекомендуем использовать Flutter для создания MVP стартапов, когда надо быстро проверить бизнес-модель. Приложение на Flutter пишется действительно быстро. Надо учесть, что использование предлагаемых из коробки Material Design и Cupertino Widgets ограничивает дизайн, но в то же время позволяет быстро проводить эксперименты с построением интерфейса и безболезненно отказываться от неудачных решений.

Отметим ряд плюсов Flutter:

  • Приложения работают быстро, так Google добился высокой скорости рендеринга.
  • В приложениях единая кодовая база iOS + Android, а это значит, что при правках не надо выполнять двойную работу.
  • Приложение выглядит нативно и абсолютно идентично на платформах Android и IOS. Это позволяет избежать двойной проработки сценариев взаимодействия с пользователями. Но можно и реализовать интерфейс под каждую из платформ.
  • Приложение легко интегрировать с Google Services и Google Cloud, если есть такая потребность.
  • Для разработчиков есть очень крутые инструменты на базе Android Studio и Visual Studio Code, отличная документация.

Если необходимо реализовать проект с идентичным функционалом Web и Mobile, то для этой цели оптимальным выбором может быть ReactNative или Progressive Web Apps, так как Flutter не работает с web. Но это дело времени, Google уже объявил о поддержке web в проекте Hummingbird.

Flutter, как и другие кроссплатформенные инструменты, не решает специфические для системы задачи, такие как управление контактами, bluetooth, работа со звуком, отправка SMS. Для этого придется искать или самостоятельно писать плагины. Но с учетом того, что сообщество разработчиков Flutter растёт и отдает свои наработки в open source, многие задачи в скором времени будут решены.

В дополнение посоветуем наш митап на тему Flutter — расскажем все самое важное за час.

{ "author_name": "Evrone", "author_type": "editor", "tags": [], "comments": 16, "likes": 35, "favorites": 35, "is_advertisement": false, "subsite_label": "evrone", "id": 57589, "is_wide": true, "is_ugc": false, "date": "Tue, 05 Feb 2019 14:56:39 +0300" }
{ "id": 57589, "author_id": 250259, "diff_limit": 1000, "urls": {"diff":"\/comments\/57589\/get","add":"\/comments\/57589\/add","edit":"\/comments\/edit","remove":"\/admin\/comments\/remove","pin":"\/admin\/comments\/pin","get4edit":"\/comments\/get4edit","complain":"\/comments\/complain","load_more":"\/comments\/loading\/57589"}, "attach_limit": 2, "max_comment_text_length": 5000, "subsite_id": 250259 }

16 комментариев 16 комм.

Популярные

По порядку

Написать комментарий...
5

Похоже Flutter стал катализатором изучения Dart для многих.

Ответить
2

Хреново что для взаимодействием с железом надо писать платформо-специфичный код. А было бы круто дёрнуть объект camera и вызвать метод сделать кадр.

Ответить
7

У flutter есть набор официально поддерживаемых плагинов, которые уже включены в репозиторий самого flutter https://github.com/flutter/plugins.
Среди них есть:
1) image_picker: https://github.com/flutter/plugins/blob/master/packages/image_picker
на Dart получение картинки с камеры выглядит так:
var image = await ImagePicker.pickImage(source: ImageSource.camera);

2) если же нам нужен CameraView, например для AR приложения, то используем из коробки плагин camera https://github.com/flutter/plugins/blob/master/packages/camera

Ответить
1

Крутяк, спасибо за пояснения

Ответить
3

Дизайн приятный, тема модная.

Понимаю, что немного не по теме, но возникло пару вопросов по содержанию:
- "успешно создали". Успех, это что; Доделали приложение?
- "и быстром запуске стартапов". Стартап, это что; Наличие приложения?

Ответить
4

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

Ответить
1

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

Ответить
3

Для написания плагина Flutter можно использовать как objective-c, java, так и Swift, Kotlin. https://flutter.io/docs/development/packages-and-plugins/developing-packages.

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

Ответить
0

Беда не в том что надо писать платформо-специфичный код, беда в том что нельзя это делать на dart)

Ответить
4

Dart код на выходе компилируется в платформенный код, но у iOS и Android разные API, поэтому создавая плагин, мы всего лишь создаем общую удобную точку входа, которую можно одинаково использовать на обеих платформах.
Например получение картинки камеры очень просто: var image = await ImagePicker.pickImage(source: ImageSource.camera);

Ответить
2

Используя Xamarin я имею доступ к 100% нативных API на каждой платформе, поэтому мне не нужно разрабатывать на "нативных" языках типа Kotlin и Swift. У flutter и dart с этим, как я понимаю, проблемы. Поправьте если я ошибаюсь.

Ответить
2

Для организации доступа к нативным API Хamarin использует технику биндингов. Эти биндинги либо поставляются с очередным обновлением xamarin, либо генерируются самим разработчиком с помощью утилиты. Проблема тут в том, что эти нативные API в iOS и Android разрабатывались и тестировались именно для целевых языков, objC, Java, Swift, Kotlin. Очень часто некоторые вещи можно качественно реализовать только на нативном языке, например нельзя вызывать некоторые API в рабочем потоке. После генерации биндингов для какой-либо библиотеки разработчик остается один на один с подобными проблемами в контексте Xamarin и .NET, В то время, как для обычных средств разработки куча примеров и ответов на вопросы. Да, биндинги это быстро и удобно, но нативные плагины это надежно и любые платформенные вопросы такой подход решает лучше.

Ответить
1

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

Ответить
1

Looks very good and interesting content share with me. It's one the future technology. Keep it up!

Ответить
0

thnz

Ответить
1

Почему использоватил, objective-c и java. Сейчас же есть другие языки, например: Swift, Kotlin?

Ответить
0
{ "page_type": "article" }

Прямой эфир

[ { "id": 1, "label": "100%×150_Branding_desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox_method": "createAdaptive", "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "ezfl" } } }, { "id": 2, "label": "1200х400", "provider": "adfox", "adaptive": [ "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "ezfn" } } }, { "id": 3, "label": "240х200 _ТГБ_desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "fizc" } } }, { "id": 4, "label": "240х200_mobile", "provider": "adfox", "adaptive": [ "phone" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "flbq" } } }, { "id": 5, "label": "300x500_desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "ezfk" } } }, { "id": 6, "label": "1180х250_Interpool_баннер над комментариями_Desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "pp": "h", "ps": "bugf", "p2": "ffyh" } } }, { "id": 7, "label": "Article Footer 100%_desktop_mobile", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "fjxb" } } }, { "id": 8, "label": "Fullscreen Desktop", "provider": "adfox", "adaptive": [ "desktop", "tablet" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "fjoh" } } }, { "id": 9, "label": "Fullscreen Mobile", "provider": "adfox", "adaptive": [ "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "fjog" } } }, { "id": 10, "disable": true, "label": "Native Partner Desktop", "provider": "adfox", "adaptive": [ "desktop", "tablet" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fmyb" } } }, { "id": 11, "disable": true, "label": "Native Partner Mobile", "provider": "adfox", "adaptive": [ "phone" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fmyc" } } }, { "id": 12, "label": "Кнопка в шапке", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "p1": "bscsh", "p2": "fdhx" } } }, { "id": 13, "label": "DM InPage Video PartnerCode", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "adfox_method": "createAdaptive", "adfox": { "ownerId": 228129, "params": { "pp": "h", "ps": "bugf", "p2": "flvn" } } }, { "id": 14, "label": "Yandex context video banner", "provider": "yandex", "yandex": { "block_id": "VI-223676-0", "render_to": "inpage_VI-223676-0-1104503429", "adfox_url": "//ads.adfox.ru/228129/getCode?pp=h&ps=bugf&p2=fpjw&puid1=&puid2=&puid3=&puid4=&puid8=&puid9=&puid10=&puid21=&puid22=&puid31=&puid32=&puid33=&fmt=1&dl={REFERER}&pr=" } }, { "id": 15, "label": "Плашка на главной", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "adfox": { "ownerId": 228129, "params": { "p1": "byudx", "p2": "ftjf" } } }, { "id": 16, "label": "Кнопка в шапке мобайл", "provider": "adfox", "adaptive": [ "tablet", "phone" ], "adfox": { "ownerId": 228129, "params": { "p1": "byzqf", "p2": "ftwx" } } }, { "id": 17, "label": "Stratum Desktop", "provider": "adfox", "adaptive": [ "desktop" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "fzvb" } } }, { "id": 18, "label": "Stratum Mobile", "provider": "adfox", "adaptive": [ "tablet", "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "fzvc" } } }, { "id": 19, "label": "Тизер на главной", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "p1": "cbltd", "p2": "gazs" } } } ]
Команда калифорнийского проекта
оказалась нейронной сетью
Подписаться на push-уведомления
{ "page_type": "default" }