Рейтинг мобильных разработчиков России по выручке в 2023 году
Hola, Amigos! Ну что, пошла жара! Рейтинг Digirate опубликовал результаты ииии… *барабанная дробь*
Amiga заняла 8 место среди компаний мобильных разработчиков по выручке в 2023 году❤️
Это не может не радовать, ведь нам всего 3 года! Честно признаться, когда мы погружаемся в рутину, то думаем, что за 3 года можно было и лучше. Но когда мы смотрим на цифры,а цифры никогда не лгут , то понимаем, что растем космически!
И останавливаться не собираемся. Уверенно стремимся в ТОП!
А если хочешь вместе с нами, то присоединяйся к нашей команде.
Hola, Amigos! Ну что, пошла жара! Рейтинг Digirate опубликовал результаты ииии… *барабанная дробь*
Amiga заняла 8 место среди компаний мобильных разработчиков по выручке в 2023 году
Это не может не радовать, ведь нам всего 3 года! Честно признаться, когда мы погружаемся в рутину, то думаем, что за 3 года можно было и лучше. Но когда мы смотрим на цифры,
И останавливаться не собираемся. Уверенно стремимся в ТОП!
А если хочешь вместе с нами, то присоединяйся к нашей команде.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍24🎉4💘3
Hola, Amigos! Сегодняшнего дня с нетерпением ждали все IT компании. Подготовка к Рейтингу Рунета, без преувеличений, длится целый год. Апрель выдался сумасшедшим, потому что нововведения сыпались на почту каждый день. В прямом смысле, хотелось рвать волосы на голове🤪
Но нужно отдать должное всем организаторам Рейтинга, ведь с каждым годом он становится всё прозрачнее и серьезнее, что позволяет заказчикам видеть ясную картину рынка заказной разработки. А также хотелось бы выразить благодарность за оперативные ответы, советы и разъяснения🙏
Что ж, перейдем к нашим победам:
1 место среди молодых разработчиков мобильных приложений
1 место среди молодых digital-подрядчиков крупнейших компаний
2 место среди разработчиков мобильных приложений для оптовой и розничной торговли
3 место среди компаний по анализу и тестированию мобильных приложений
4 место среди разработчиков мобильных приложений для промышленности и оборудования
5 место среди разработчиков приложений для услуг
6 место среди мобильных разработчиков Москвы
21 место среди мобильных разработчиков России
Мы сильно поднялись в этом году! Невероятно гордимся командой и радуемся результатам рейтинга 2024 года. Принимаем ваши поздравления в комментариях и поднимаем бокальчик шампанского!
Страшно представить, что будет на 4 году Amiga. Страшно интересно!😏
Но нужно отдать должное всем организаторам Рейтинга, ведь с каждым годом он становится всё прозрачнее и серьезнее, что позволяет заказчикам видеть ясную картину рынка заказной разработки. А также хотелось бы выразить благодарность за оперативные ответы, советы и разъяснения🙏
Что ж, перейдем к нашим победам:
1 место среди молодых разработчиков мобильных приложений
1 место среди молодых digital-подрядчиков крупнейших компаний
2 место среди разработчиков мобильных приложений для оптовой и розничной торговли
3 место среди компаний по анализу и тестированию мобильных приложений
4 место среди разработчиков мобильных приложений для промышленности и оборудования
5 место среди разработчиков приложений для услуг
6 место среди мобильных разработчиков Москвы
21 место среди мобильных разработчиков России
Мы сильно поднялись в этом году! Невероятно гордимся командой и радуемся результатам рейтинга 2024 года. Принимаем ваши поздравления в комментариях и поднимаем бокальчик шампанского!
Страшно представить, что будет на 4 году Amiga. Страшно интересно!😏
👏20❤10🔥8
This media is not supported in your browser
VIEW IN TELEGRAM
Макросы Dart: повышение уровня абстракции разработки
Hola, Amigos! Недавно прошла конфа Google I/O 2024, на которой было представлено множество новинок, но сегодня поговорим о нашумевшей фиче — Макросы Dart. Кто не смотрел прямой эфир, сейчас расскажем, в чем соль.
Долгое время болевой точкой для разработчиков Dart была тривиальная, но утомительная схема сериализации и десериализации JSON-данных. Создание многократно используемого и достаточно мощного решения является сложной задачей в Dart, поскольку он не поддерживает рефлексию во время выполнения по соображениям производительности. В качестве альтернативы мы прибегаем к решениям по генерации кода, таким как JsonSerializable. Они зависят от внешних инструментов, которые запускаются перед самим кодом, что усложняет работу разработчика.
На конференции анонсировали предварительную версию радикально нового подхода к сериализации и десериализации JSON: макроса JsonCodable.
Как это работает? Откуда взялся метод toJson() (и сопутствующий ему конструктор fromJson())?
Это экспериментальная реализация новой системы макросов, призванной упростить работу разработчиков. Когда компилятор Dart видит аннотацию @JsonCodable(), он немедленно находит определение макроса JsonCodable в реальном времени и начинает его выполнять. Вот как работает макрос:
1️⃣ Создайте новый класс - новую конструкцию языка, которая позволяет добавлять новые объявления к существующим классам.
2️⃣ Прочитайте определение класса Vehicle, данное разработчиком, и определите, что у него есть два поля - description и wheels.
3️⃣ Добавьте новую сигнатуру метода toJson в класс дополнения.
4️⃣ Заполните тело метода toJson, чтобы обработать сериализацию полей description и wheels.
Всё это происходит без задержек и интегрировано в существующие рабочие процессы разработчиков, такие как горячая перезагрузка, как показано в скринкасте.
Как вам такие новости? Делитесь в чате своими мыслями.
Hola, Amigos! Недавно прошла конфа Google I/O 2024, на которой было представлено множество новинок, но сегодня поговорим о нашумевшей фиче — Макросы Dart. Кто не смотрел прямой эфир, сейчас расскажем, в чем соль.
Долгое время болевой точкой для разработчиков Dart была тривиальная, но утомительная схема сериализации и десериализации JSON-данных. Создание многократно используемого и достаточно мощного решения является сложной задачей в Dart, поскольку он не поддерживает рефлексию во время выполнения по соображениям производительности. В качестве альтернативы мы прибегаем к решениям по генерации кода, таким как JsonSerializable. Они зависят от внешних инструментов, которые запускаются перед самим кодом, что усложняет работу разработчика.
На конференции анонсировали предварительную версию радикально нового подхода к сериализации и десериализации JSON: макроса JsonCodable.
Как это работает? Откуда взялся метод toJson() (и сопутствующий ему конструктор fromJson())?
Это экспериментальная реализация новой системы макросов, призванной упростить работу разработчиков. Когда компилятор Dart видит аннотацию @JsonCodable(), он немедленно находит определение макроса JsonCodable в реальном времени и начинает его выполнять. Вот как работает макрос:
Всё это происходит без задержек и интегрировано в существующие рабочие процессы разработчиков, такие как горячая перезагрузка, как показано в скринкасте.
Как вам такие новости? Делитесь в чате своими мыслями.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍19💘11❤5
Hola, Amigos! На связи Вова Зевеке, сегодня расскажу про пакет pod_player.
Ранее в своей статье я пробовал собрать кастомный видеоплеер с помощью пакета youtube_player_flutter. По итогу упёрся в баги, которые нельзя было решить возможностями Flutter. И нашёл замену!
Сам по себе pod_player не сильно отличается от большинства других пакетов для разработки видеоплеера. Однако, он куда меньше тормозит и быстрее грузит видео.
Сначала настроим необходимые разрешения. Для Android, нужно добавить в AndroidManifest.xml:
Если видео использует URL-адреса http, то добавляем:
Для iOS проводим настройку в файле Info.plist:
Пакет добавляет виджет PodVideoPlayer со свойствами:
- controller (PodPlayerController, контроллер для управления видеплеером);
- podProgressBarConfig (PodProgressBarConfig, настройка вёрстки полоски прогресса);
- videoThumbnail (DecorationImage?, превью видео);
- alwaysShowProgressBar (bool, определяет, будет ли всегда отображаться полоска прогресса);
- onToggleFullScreen (Future<void> Function(bool)?, коллбек при переходе плеера в полноэкранный режим);
- onLoading (Widget Function(BuildContext)?, определяет отображаемый виджет при загрузке видео);
- onVideoError (Widget Function()?, определяет отображаемый виджет при ошибке в видео);
- overlayBuilder (Widget Function(OverLayOptions)?, позволяет сделать кастомный интерфейс видеоплеера).
Чтобы плеер проигрывал определённое видео, нужно приложить ссылку на него в виде файла, веб-ссылки, youtube-id, ассет в приложении.
Код с примером пользования youtube-id:
Всем хорошего кода! Делитесь в чате своим опытом.
Ранее в своей статье я пробовал собрать кастомный видеоплеер с помощью пакета youtube_player_flutter. По итогу упёрся в баги, которые нельзя было решить возможностями Flutter. И нашёл замену!
Сам по себе pod_player не сильно отличается от большинства других пакетов для разработки видеоплеера. Однако, он куда меньше тормозит и быстрее грузит видео.
Сначала настроим необходимые разрешения. Для Android, нужно добавить в AndroidManifest.xml:
<uses-permission android:name="android.permission.INTERNET"/>
Если видео использует URL-адреса http, то добавляем:
<application
- - -
- - - - - -
android:usesCleartextTraffic="true"
Для iOS проводим настройку в файле Info.plist:
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
Пакет добавляет виджет PodVideoPlayer со свойствами:
- controller (PodPlayerController, контроллер для управления видеплеером);
- podProgressBarConfig (PodProgressBarConfig, настройка вёрстки полоски прогресса);
- videoThumbnail (DecorationImage?, превью видео);
- alwaysShowProgressBar (bool, определяет, будет ли всегда отображаться полоска прогресса);
- onToggleFullScreen (Future<void> Function(bool)?, коллбек при переходе плеера в полноэкранный режим);
- onLoading (Widget Function(BuildContext)?, определяет отображаемый виджет при загрузке видео);
- onVideoError (Widget Function()?, определяет отображаемый виджет при ошибке в видео);
- overlayBuilder (Widget Function(OverLayOptions)?, позволяет сделать кастомный интерфейс видеоплеера).
Чтобы плеер проигрывал определённое видео, нужно приложить ссылку на него в виде файла, веб-ссылки, youtube-id, ассет в приложении.
Код с примером пользования youtube-id:
@override
void initState() {
controller = PodPlayerController(
playVideoFrom: PlayVideoFrom.youtube(
widget.videoId,
),
)..initialise();
…
}
…
body: PodVideoPlayer(controller: controller),
…
Всем хорошего кода! Делитесь в чате своим опытом.
👍8🔥7👏4🤩2💘1
Hola, Amigos! На связи команда Amiga.
Docker Hub прекратил работу на территории России. Это значит, что многие из нас могут столкнуться с проблемами при доступе к важным контейнерам и образам.
Чтобы минимизировать неудобства, предлагаем рассмотреть следующие решения:
1️⃣ Зеркала и альтернативы: Используйте зеркала Docker Hub или локальные репозитории для хранения и получения образов.
Рабочее проверенное решение: huecker.io
2️⃣ VPN: Для обхода блокировки можно воспользоваться VPN-сервисами. Это поможет получить доступ к Docker Hub с российской территории.
3️⃣ Локальные решения: Разверните свои собственные локальные Docker-реестры, чтобы хранить и управлять образами в пределах вашей инфраструктуры.
Если у вас есть другие идеи или решения, делитесь в чате!
Будем рады любой информации, которая поможет всем нам продолжать работать эффективно и без перебоев🙂
Docker Hub прекратил работу на территории России. Это значит, что многие из нас могут столкнуться с проблемами при доступе к важным контейнерам и образам.
Чтобы минимизировать неудобства, предлагаем рассмотреть следующие решения:
Рабочее проверенное решение: huecker.io
Если у вас есть другие идеи или решения, делитесь в чате!
Будем рады любой информации, которая поможет всем нам продолжать работать эффективно и без перебоев
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥10👍5❤4💘1
10-14 июня WWDC 2024
Hola, Amigos! Apple анонсировала долгожданное событие для всех разработчиков — WWDC 2024 (Worldwide Developers Conference), которое пройдет с 10 по 14 июня 2024 года. Это мероприятие является одной из самых значимых конференций в мире IT, и оно будет особенно полезно для мобильных разработчиков.
Почему стоит принять участие в WWDC 2024?
WWDC традиционно является платформой для анонса новых версий iOS и iPadOS. Узнайте первыми о новых функциях и API, которые можно будет использовать для улучшения ваших приложений. Это включает новые инструменты для UI/UX, улучшенные возможности безопасности, новые способы интеграции с Apple экосистемой и многое другое.
На конференции проходят сотни сессий, где инженеры Apple делятся лучшими практиками, демонстрируют новые инструменты и показывают, как эффективно использовать новые возможности платформы. Это шанс углубить свои знания и получить ответы на технические вопросы от экспертов.
Как принять участие?
Конференция WWDC 2024 пройдет бесплатно в онлайн-формате, что делает её доступной для всех, независимо от местоположения.
Просто добавьте себе это событие в календарь и не забудьте присоединиться на YouTube, подключив субтитры, если необходимо. Некоторые сессии можно будет посмотреть в приложении.
Делитесь в чате, пойдете ли на мероприятие?
Hola, Amigos! Apple анонсировала долгожданное событие для всех разработчиков — WWDC 2024 (Worldwide Developers Conference), которое пройдет с 10 по 14 июня 2024 года. Это мероприятие является одной из самых значимых конференций в мире IT, и оно будет особенно полезно для мобильных разработчиков.
Почему стоит принять участие в WWDC 2024?
WWDC традиционно является платформой для анонса новых версий iOS и iPadOS. Узнайте первыми о новых функциях и API, которые можно будет использовать для улучшения ваших приложений. Это включает новые инструменты для UI/UX, улучшенные возможности безопасности, новые способы интеграции с Apple экосистемой и многое другое.
На конференции проходят сотни сессий, где инженеры Apple делятся лучшими практиками, демонстрируют новые инструменты и показывают, как эффективно использовать новые возможности платформы. Это шанс углубить свои знания и получить ответы на технические вопросы от экспертов.
Как принять участие?
Конференция WWDC 2024 пройдет бесплатно в онлайн-формате, что делает её доступной для всех, независимо от местоположения.
Просто добавьте себе это событие в календарь и не забудьте присоединиться на YouTube, подключив субтитры, если необходимо. Некоторые сессии можно будет посмотреть в приложении.
Делитесь в чате, пойдете ли на мероприятие?
❤5🔥5👍3💘1
This media is not supported in your browser
VIEW IN TELEGRAM
Разработка с AI
Hola, Amigos! Сегодня поделимся с вами новостями о нейросети Gemini Pro, которая помогает разработчикам ускорить и упростить написание кода Android-приложений. Плюс повысить их качество, опираясь на подсказки AI.
Общаться с Gemini можно как на общие темы по разработке, так и задавая конкретные вопросы в окне чата. Нейросеть запоминает контекст разговора, что упрощает коммуникацию ведь не нужно объяснять каждый раз всё сначала. Например, у AI можно спросить, как добавить в приложение поддержку камеры.
Gemini поможет написать код с нуля, дописать его недостающие части, предложить свои дополнения и прокомментировать отдельные участки кода. Дополнительной возможностью стало создание приложений с генеративным AI на основе начального шаблона. Поддерживается ввод не только текста, но и изображений.
Для доступа к Gemini необходимо войти в свой аккаунт. Вы можете сами решить, нужно ли нейросеть автоматически дополнять код, или она будет взаимодействовать с ним только по запросу.
На данный момент Gemini в Android Studio функционирует в тестовом режиме и опробовать его можно бесплатно!
Рассказывайте в чате, кто уже успел повзаимодействовать с Gemini? Как вам?
Hola, Amigos! Сегодня поделимся с вами новостями о нейросети Gemini Pro, которая помогает разработчикам ускорить и упростить написание кода Android-приложений. Плюс повысить их качество, опираясь на подсказки AI.
Общаться с Gemini можно как на общие темы по разработке, так и задавая конкретные вопросы в окне чата. Нейросеть запоминает контекст разговора, что упрощает коммуникацию ведь не нужно объяснять каждый раз всё сначала. Например, у AI можно спросить, как добавить в приложение поддержку камеры.
Gemini поможет написать код с нуля, дописать его недостающие части, предложить свои дополнения и прокомментировать отдельные участки кода. Дополнительной возможностью стало создание приложений с генеративным AI на основе начального шаблона. Поддерживается ввод не только текста, но и изображений.
Для доступа к Gemini необходимо войти в свой аккаунт. Вы можете сами решить, нужно ли нейросеть автоматически дополнять код, или она будет взаимодействовать с ним только по запросу.
На данный момент Gemini в Android Studio функционирует в тестовом режиме и опробовать его можно бесплатно!
Рассказывайте в чате, кто уже успел повзаимодействовать с Gemini? Как вам?
👍9🔥3❤2👏1🤔1💘1
Краткая сводка WWDC 2024
Hola, Amigos! Недавно из опроса мы узнали, что профильные конференции не пользуются спросом среди подписчиков нашего канала, поэтому летим к вам с новостями WWDC 2024!
Про «летим» не шутили, именно так и началась презентация Apple. Будто заставка к фильму про супергероев🙂
iOS 18
Главные нововведения коснулись рабочего стола и всего, что с ним связано.
– Иконки можно раскрашивать и расставлять, как душе угодно. Очередная боль для разработчиков, если это будет делаться не в автоматическом режиме.
– Обновился центр управления: свайп вниз, слева, сверху. И иконки можно создавать свои, как на экране блокировки.
– Изменения коснулись и приложений: фото, сообщения и почта; но самая интересная фича — скрытие скриншотов в 2 клика.
iPadOS 18
– Впервые iPad с калькулятором! Можно писать сложные уравнения, и он сам посчитает.
– Обновились заметки, теперь рукописный текст будет исправляться ИИ.
macOS 15 Sequoia
– Самая полезная фича — работа с iPhone. Теперь можно вывести экран телефона на macOS. Это очень удобно для проведения демонстраций заказчику.
– Пуши будут объединяться, но пока не понятно как именно. Если сообщение прилетит в Telegram, то на маке будет показано только сообщение из Telegram для macOS или с телефона тоже?
– Наконец-то появилось удобное позиционирование рабочих окон, больше не требуется дополнительное приложение.
Apple Intelligence (AI)
И главная новость — Apple добавила ИИ в свои системы. Собственную полноценную LLM не используют [не доросла, значит, до представления миру]. А что-то сложное, связанное с текстом, делает ChatGPT бесплатно.
Что умеет AI? Генерирует картинки в 3 стилях, основываясь на контексте. Заглушает ненужные пуши. Обновленная Siri составит сильную конкуренцию остальным ИИ.
Даты релизов
🔴 Developer Beta уже доступна, но нужна подписка.
🔴 Public Beta выйдет в июле.
🔴 Финальный релиз осенью. iOS, watchOS, iPadOS в сентябре, macOS в октябре.
Пишите в чате, было ли интересно? И делитесь своим мнением об обновлениях!
Hola, Amigos! Недавно из опроса мы узнали, что профильные конференции не пользуются спросом среди подписчиков нашего канала, поэтому летим к вам с новостями WWDC 2024!
Про «летим» не шутили, именно так и началась презентация Apple. Будто заставка к фильму про супергероев
iOS 18
Главные нововведения коснулись рабочего стола и всего, что с ним связано.
– Иконки можно раскрашивать и расставлять, как душе угодно. Очередная боль для разработчиков, если это будет делаться не в автоматическом режиме.
– Обновился центр управления: свайп вниз, слева, сверху. И иконки можно создавать свои, как на экране блокировки.
– Изменения коснулись и приложений: фото, сообщения и почта; но самая интересная фича — скрытие скриншотов в 2 клика.
iPadOS 18
– Впервые iPad с калькулятором! Можно писать сложные уравнения, и он сам посчитает.
– Обновились заметки, теперь рукописный текст будет исправляться ИИ.
macOS 15 Sequoia
– Самая полезная фича — работа с iPhone. Теперь можно вывести экран телефона на macOS. Это очень удобно для проведения демонстраций заказчику.
– Пуши будут объединяться, но пока не понятно как именно. Если сообщение прилетит в Telegram, то на маке будет показано только сообщение из Telegram для macOS или с телефона тоже?
– Наконец-то появилось удобное позиционирование рабочих окон, больше не требуется дополнительное приложение.
Apple Intelligence (AI)
И главная новость — Apple добавила ИИ в свои системы. Собственную полноценную LLM не используют [не доросла, значит, до представления миру]. А что-то сложное, связанное с текстом, делает ChatGPT бесплатно.
Что умеет AI? Генерирует картинки в 3 стилях, основываясь на контексте. Заглушает ненужные пуши. Обновленная Siri составит сильную конкуренцию остальным ИИ.
Даты релизов
Пишите в чате, было ли интересно? И делитесь своим мнением об обновлениях!
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6💘3💩2🐳2🏆2🤷1
Многомодульность в Flutter
Hola, Amigos! На связи Павел Гершевич, Flutter Team Lead в Amiga. Сегодня расскажу, как создавать большие приложения на Flutter с помощью многомодульности. Также она пригодится в случаях, когда нужно создать набор библиотек и когда общий код должен быть у 2 и более приложений.
У многомодульности есть 2 основных подхода: монорепозиторий и полирепозиторий. Сегодня рассмотрим первый. Кто-то изобретает велосипед, а мы используем готовый пакет Melos.
Для начала нам нужно установить его глобально через консоль.
Далее создаем папку под проект. В ней обязательно должно быть 2 файла:
После этого мы получаем зависимости для всех созданных нами пакетов. Также это сгенерирует файлы
Так у нас появляется наш многомодульный проект на Dart и Flutter.
Поделитесь в чате, в каких многомодульных Flutter-проектах вы участвовали? С какими трудностями встречались?
Hola, Amigos! На связи Павел Гершевич, Flutter Team Lead в Amiga. Сегодня расскажу, как создавать большие приложения на Flutter с помощью многомодульности. Также она пригодится в случаях, когда нужно создать набор библиотек и когда общий код должен быть у 2 и более приложений.
У многомодульности есть 2 основных подхода: монорепозиторий и полирепозиторий. Сегодня рассмотрим первый. Кто-то изобретает велосипед, а мы используем готовый пакет Melos.
Для начала нам нужно установить его глобально через консоль.
dart pub global activate melos
Далее создаем папку под проект. В ней обязательно должно быть 2 файла:
pubspec.yaml
, в котором обозначим название проекта и версию Dart, а также melos.yaml
для настроек монорепозитория. Создаём нужные приложения, пакеты и плагины, в которые будем писать код. Вот примерное расположение папок для 2 приложений:my_project
|— apps
| |— app_1
| |— app_2
|— common
| |— ui_kit
| |— models
|— features
| |— feature_1
| |— feature_2
| |— feature_3
|— melos.yaml
|— pubspec.yaml
|— README.md
pubspec.yaml
name: my_project
environment:
sdk: '>=3.0.0 <4.0.0'
dev_dependencies:
melos: ^6.0.0
melos.yaml
name: my_project
packages:
- apps/**
- common/**
- features/**
После этого мы получаем зависимости для всех созданных нами пакетов. Также это сгенерирует файлы
pubspec_overrides.yaml
, которые нужно не забыть добавить в .gitignore
. Делается это командой:melos bootstrap
Так у нас появляется наш многомодульный проект на Dart и Flutter.
Поделитесь в чате, в каких многомодульных Flutter-проектах вы участвовали? С какими трудностями встречались?
🔥12👍6❤3👎1💘1
Project IDX
Hola, Amigos! Недавно мы рассказывали про Gemini в Android Studio, но в Flutter он не у всех работает, как мы узнали из нашего чата. И для вас у нас есть решение — Project IDX.
Project IDX — облачная IDE от Google нового поколения, которая позволяет создавать fullstack приложения прямо в браузере. Уже поддерживает основные технологии:
⚪️ Для Backend: Node Express, Go, Rust, Django, Flask, .NET.
⚪️ Для Frontend: Angular, React.js, Vue.js, Svelte и многое другое, можно даже на простом HTML и CSS что-то написать.
⚪️ Если нужно и то, и другое — NextJS.
⚪️ Для ИИ: Gemini API.
⚪️ И для мобильных приложений, конечно же, Flutter.
Под каждую из этих технологий уже есть шаблоны, но вы можете подключить свой проект из GitHub.
Flutter проекты в Project IDX умеют запускаться на Android и Web. Работают Hot Restart и Hot Reload, причем иногда быстрее, чем через Android Studio или Xcode. Даже DevTools не нужно отдельно запускать, они уже встроены.
При помощи Project IDX можно сразу захостить Web сборку в Firebase или добавить Gemini API в приложение, нажатием одной кнопки⚙️
Делитесь в чате, пробовали ли вы Project IDX?
Hola, Amigos! Недавно мы рассказывали про Gemini в Android Studio, но в Flutter он не у всех работает, как мы узнали из нашего чата. И для вас у нас есть решение — Project IDX.
Project IDX — облачная IDE от Google нового поколения, которая позволяет создавать fullstack приложения прямо в браузере. Уже поддерживает основные технологии:
Под каждую из этих технологий уже есть шаблоны, но вы можете подключить свой проект из GitHub.
Flutter проекты в Project IDX умеют запускаться на Android и Web. Работают Hot Restart и Hot Reload, причем иногда быстрее, чем через Android Studio или Xcode. Даже DevTools не нужно отдельно запускать, они уже встроены.
При помощи Project IDX можно сразу захостить Web сборку в Firebase или добавить Gemini API в приложение, нажатием одной кнопки
Делитесь в чате, пробовали ли вы Project IDX?
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥12👍6🤝4
Hola, Amigos! На связи Владимир Зевеке и Михаил Чернецов, Flutter-devs Amiga. Сегодня обсудим MediaQuery — важный инструмент для адаптивной верстки.
MediaQuery — это класс, устанавливающие поддерево, в котором для заданных данных разрешаются медиа-запросы. Самое популярное его свойство — size, к которому часто обращаются через MediaQuery.of(context).size.
Однако, это не оптимально. Рекомендуется использовать MediaQuery.sizeOf(context). Разница в том, что функция of() заставляет виджет перестраиваться при изменении любого свойства MediaQuery, тогда как sizeOf() этого не делает, что повышает производительность. То же самое относится и к другим свойствам MediaQuery.
Несмотря на удобство MediaQuery, им не рекомендуется злоупотреблять в коде, поскольку в определённых случаях поведение данного инструмента может стать труднопредсказуемым. Его можно использовать, если:
🔴 Приложение должно адаптировать дизайн под разные размеры экрана.
🔴 Виджету требуется динамическая ширина (width).
🔴 Задачу нельзя решить другим инструментом адаптивной верстки, например, Flexible.
MediaQuery также предоставляет информацию об экране устройства: viewInsets и viewPadding. viewInsets полезен для определения, открыта ли клавиатура. viewPadding дает информацию о небезопасной зоне устройства.
Ещё одна фишка — использование textScaler для адаптивной верстки, это полезно если размеры какого-то виджета должны увеличиваться при увеличении размера текста. Например, виджет фиксированной высоты или размер иконок в кнопках.
Кроме того, MediaQuery позволяет узнать находится ли устройство в режиме «темной темы», используя поле platformBrightness и ориентацию устройства (ландшафтный или портретный режим).
Делитесь своими вопросами и опытом в чате!
MediaQuery — это класс, устанавливающие поддерево, в котором для заданных данных разрешаются медиа-запросы. Самое популярное его свойство — size, к которому часто обращаются через MediaQuery.of(context).size.
Однако, это не оптимально. Рекомендуется использовать MediaQuery.sizeOf(context). Разница в том, что функция of() заставляет виджет перестраиваться при изменении любого свойства MediaQuery, тогда как sizeOf() этого не делает, что повышает производительность. То же самое относится и к другим свойствам MediaQuery.
Несмотря на удобство MediaQuery, им не рекомендуется злоупотреблять в коде, поскольку в определённых случаях поведение данного инструмента может стать труднопредсказуемым. Его можно использовать, если:
MediaQuery также предоставляет информацию об экране устройства: viewInsets и viewPadding. viewInsets полезен для определения, открыта ли клавиатура. viewPadding дает информацию о небезопасной зоне устройства.
Ещё одна фишка — использование textScaler для адаптивной верстки, это полезно если размеры какого-то виджета должны увеличиваться при увеличении размера текста. Например, виджет фиксированной высоты или размер иконок в кнопках.
Кроме того, MediaQuery позволяет узнать находится ли устройство в режиме «темной темы», используя поле platformBrightness и ориентацию устройства (ландшафтный или портретный режим).
Делитесь своими вопросами и опытом в чате!
Please open Telegram to view this post
VIEW IN TELEGRAM
👍19❤4🔥4👌1
Hola, Amigos! Недавно прошла главная конференция по мобильной разработке этой весны — Mobius 2024 Spring.
Mobius — техническая конференция для специалистов, связанных с мобильной разработкой: iOS- и Android-разработчиков, архитекторов мобильных приложений, специалистов по DevOps, тестировщиков, тимлидов и руководителей проектов.
Для каждой из платформ спикеры обсуждают как нативную, так и кроссплатформенную разработку. И всё, что «вокруг»: от Swift до систем сборки.
От Amiga на Mobius выступил Павел Гершевич, наш Flutter Team Lead с докладом «Создание indoor-карты здания на Flutter».
Обсудили реализацию интересной задачи — размещение на одном или нескольких экранах внутренней карты здания. Рассказали о подходах и собственном решении с использованием Flutter.
Кроме этого, Павел выступил экспертом у Кирилла Адещенко из РСХБ-Интех на теме «Многомодульное приложение на Flutter» и доказал, что на Flutter можно создавать крупные приложения.
Пока доступны только презентации. Видеозаписями поделимся немного позже!
Пишите в чат, кто был на конференции? Чьи доклады понравились больше всего?
Mobius — техническая конференция для специалистов, связанных с мобильной разработкой: iOS- и Android-разработчиков, архитекторов мобильных приложений, специалистов по DevOps, тестировщиков, тимлидов и руководителей проектов.
Для каждой из платформ спикеры обсуждают как нативную, так и кроссплатформенную разработку. И всё, что «вокруг»: от Swift до систем сборки.
От Amiga на Mobius выступил Павел Гершевич, наш Flutter Team Lead с докладом «Создание indoor-карты здания на Flutter».
Обсудили реализацию интересной задачи — размещение на одном или нескольких экранах внутренней карты здания. Рассказали о подходах и собственном решении с использованием Flutter.
Кроме этого, Павел выступил экспертом у Кирилла Адещенко из РСХБ-Интех на теме «Многомодульное приложение на Flutter» и доказал, что на Flutter можно создавать крупные приложения.
Пока доступны только презентации. Видеозаписями поделимся немного позже!
Пишите в чат, кто был на конференции? Чьи доклады понравились больше всего?
👍10👏4🔥3
IT’S TIME TO RUN
Hola, Amigos! Приглашаем 07 июля всех-всех-всех разработчиков, аналитиков, маркетологов, тестировщиков и других специалистов, кто напрямую связан с IT-сферой поучаствовать в самом масштабном и энергичном мероприятии RUNIT.
RUNIT — это спортивный фестиваль для IT-сообщества. В этом году пройдет юбилейный 5-ый забег в музее-заповеднике «Коломенское». В этом году участвует 4000 бегунов и еще как минимум 2000 болельщиков!
Amiga также присоединится к этому событию, такое нельзя пропускать! И в этот раз вы увидите нас в новом свете. Участвуйте и приходите на нашу промо-площадку, где вы сможете:
🔴 познакомиться с нашей командой и обменяться опытом;
🔴 поучаствовать в ловком конкурсе «Кольцеброс» и получить самый классный мерч от нас и подарки от наших партнеров HolyCorn и FitnesSHOK.
🔴 отдохнуть в тени под кронами деревьев на пледе или зарядиться энергетическим гелем от Спорт Фермы перед забегом.
Для участия регистрируйтесь на сайте!
До встречи на RUNIT 07 июля❤️
Hola, Amigos! Приглашаем 07 июля всех-всех-всех разработчиков, аналитиков, маркетологов, тестировщиков и других специалистов, кто напрямую связан с IT-сферой поучаствовать в самом масштабном и энергичном мероприятии RUNIT.
RUNIT — это спортивный фестиваль для IT-сообщества. В этом году пройдет юбилейный 5-ый забег в музее-заповеднике «Коломенское». В этом году участвует 4000 бегунов и еще как минимум 2000 болельщиков!
Amiga также присоединится к этому событию, такое нельзя пропускать! И в этот раз вы увидите нас в новом свете. Участвуйте и приходите на нашу промо-площадку, где вы сможете:
Для участия регистрируйтесь на сайте!
До встречи на RUNIT 07 июля
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6❤3🔥3💘2
This media is not supported in your browser
VIEW IN TELEGRAM
Hola, Amigos! На связи Вова Зевеке, Flutter dev Amiga. Сегодня расскажу про #пп scroll_highlight_text.
Пакет полезен для поиска в большом объеме текста. Виджет
Виджет обладает свойствами:
⚪️ text (String, отображаемый текст виджета);
⚪️ searchController (TextEditingController, контроллер для управления поведением виджета);
⚪️ autoDisposeSearchController (bool, определяет, нужно ли автоматически удалять контроллер при удалении виджета из дерева виджетов);
⚪️ textDirection (TextDirection, определяет направление текста);
⚪️ highlightedTextStyle (TextStyle, стиль текста, применяемый к выделенным участкам текста);
⚪️ unHighlightedTextStyle (TextStyle, стиль текста, примененный к остальной части текста);
⚪️ padding (EdgeInsetsGeometry, внутренние отступы вокруг текстового виджета);
⚪️ durationOfScroll (Duration, продолжительность анимации скролла);
⚪️ animationCurveOfScroll (Curve, тип анимации скролла).
Пример:
Хорошего всем кода! Делитесь в чате своим опытом использования данного пакета.
Пакет полезен для поиска в большом объеме текста. Виджет
HighlightedTextScrollable
позволяет скроллить текст и выделять совпадения при вводе ключевого слова в поиск.Виджет обладает свойствами:
Пример:
final TextEditingController controller = TextEditingController();
final String value =
'Понедельник - день тяжёлый, <…>';
@override
Widget build(BuildContext context) {
return Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Padding(
padding: const EdgeInsets.symmetric(horizontal: 16.0),
child: SearchBar(
hintText: 'Start search',
controller: controller,
),
),
HighlightedTextScrollable(
text: value,
searchController: controller,
highlightedTextStyle: const TextStyle(
fontSize: 22,
color: Colors.red,
fontWeight: FontWeight.w600,
),
unHighlightedTextStyle: const TextStyle(
fontSize: 22,
color: Colors.black,
),
padding: const EdgeInsets.symmetric(
horizontal: 16,
vertical: 20,
),
),
],
);
}
Хорошего всем кода! Делитесь в чате своим опытом использования данного пакета.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥16👍7💯2👀1
Hola, Amigos! На связи Павел Гершевич, Flutter Team Lead в Amiga. Вы часто спрашиваете в комментариях, где можно научиться Flutter, и просите поделиться полезными материалами. И мы очень стараемся делать это в наших постах!
Но хотим порадовать вас еще одной классной новостью: вместе с тремя талантливыми и увлеченными Flutter авторами мы напишем книгу «Основы Flutter».
Вы должны знать своих героев:
🔵 Станислав Чернышев — автор YouTube-канала «MADTeacher» и учебника «Основы Dart».
🔵 Юрий Петров — Flutter Tech Lead в Friflex, автор YouTube- и телеграм-каналов «Мобильный разработчик», а также курсов на платформе Stepik.
🔵 Станислав Ильин — Lead Flutter developer, автор YouTube- и телеграм-каналов «Стас Ильин».
🔵 И конечно же я, Павел Гершевич — Flutter Team Lead в Amiga, спикер различных конференций и автор телеграм-канала «Flutter TechLead Notes» буду соавтором книги.
Все самые свежие материалы книги, прошедшие редактуру, будут выкладываться в курс на Stepik — Основы Flutter. Это позволит нам собирать быструю обратную связь по добавленному материалу и вносить правки.
Хочешь принять участие? Предлагай тему сквозного проекта для книги в нашем чате, и если авторскому коллективу она понравится, мы добавим отдельное упоминание в графе с благодарностями.
Ждите прямых эфиров на нашем канале. Будем держать вас в курсе новостей о развитии книги!🙂
Но хотим порадовать вас еще одной классной новостью: вместе с тремя талантливыми и увлеченными Flutter авторами мы напишем книгу «Основы Flutter».
Вы должны знать своих героев:
Все самые свежие материалы книги, прошедшие редактуру, будут выкладываться в курс на Stepik — Основы Flutter. Это позволит нам собирать быструю обратную связь по добавленному материалу и вносить правки.
Хочешь принять участие? Предлагай тему сквозного проекта для книги в нашем чате, и если авторскому коллективу она понравится, мы добавим отдельное упоминание в графе с благодарностями.
Ждите прямых эфиров на нашем канале. Будем держать вас в курсе новостей о развитии книги!
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥13❤4👏2💯2
Hola, Amigos! На связи Михаил Чернецов, Flutter dev в Amiga. Сегодня поговорим про Injectable — мощный пакет для управления зависимостями в приложении.
Injectable является оберткой над GetIt и помогает создавать Dependency Injection (DI) с помощью кодогенерации, избавляя от необходимости вручную редактировать файл с зависимостями⚙️
GetIt — это популярный service locator, который позволяет централизованно управлять зависимостями в приложении. Однако, некоторые считают service locatorантипаттерном, так как он может нарушать принципы SOLID и инкапсуляции.
Основные возможности Injectable
Injectable создает файл, который автоматически регистрирует сервисы, синглтоны и модули. Для добавления модуля достаточно пометить класс аннотацией
Пример использования
Чтобы подключить сторонние зависимости, такие как
Многомодульность
Injectable поддерживает многомодульность. Чтобы создать файл в модуле, используйте:
Это создаст
Injectable предлагает гибкие настройки, позволяя управлять последовательностью создания зависимостей в случае необходимости⚙️
Будем рады вашим вопросам и обсуждениям в чате!
Injectable является оберткой над GetIt и помогает создавать Dependency Injection (DI) с помощью кодогенерации, избавляя от необходимости вручную редактировать файл с зависимостями
GetIt — это популярный service locator, который позволяет централизованно управлять зависимостями в приложении. Однако, некоторые считают service locator
Основные возможности Injectable
Injectable создает файл, который автоматически регистрирует сервисы, синглтоны и модули. Для добавления модуля достаточно пометить класс аннотацией
@injectable
. Этот класс затем будет доступен через GetIt.instance<YourService>()
. Вы также можете объявить синглтоны с помощью аннотаций @singleton
и @lazysingleton
.Пример использования
Чтобы подключить сторонние зависимости, такие как
dio
или shared_preferences
, создайте класс ServicesInjectionModule
и пометьте его аннотацией @module
. Если вам нужно дождаться завершения фабрики, возвращающей future
, используйте аннотацию @preResolve
:
@preResolve
Future<SharedPreferences> get sharedPreferences => SharedPreferences.getInstance();
Многомодульность
Injectable поддерживает многомодульность. Чтобы создать файл в модуле, используйте:
@InjectableInit.microPackage()
void initMicroPackage() {}
Это создаст
FeaturePackageModule
, который нужно будет добавить в externalPackageModules
приложения.Injectable предлагает гибкие настройки, позволяя управлять последовательностью создания зависимостей в случае необходимости
Будем рады вашим вопросам и обсуждениям в чате!
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥5👍3❤2💩2👎1👏1
This media is not supported in your browser
VIEW IN TELEGRAM
Hola, Amigos! На связи Владимир Зевеке, Flutter dev в Amiga. Сегодня поговорим о пакете audio_waveforms. Этот пакет добавляет возможность записывать аудиофайлы и воспроизводить их в отдельном виджете, с красивым визуальным шлейфом звуков. Он особенно полезен для разработки чатов.
Установка и настройка
Для установки нам нужно подключить пакет и следуя инструкции из pub.dev добавить разрешение на использование микрофона для необходимых платформ.
Инициализация
Создаем поля для виджетов записи и воспроизведения аудио:
Инициализируем контроллеры:
Не забываем освобождать ресурсы:
Запись и воспроизведение
Для записи нужно проверить дал ли пользователь разрешение на использование микрофона:
Если оно у нас есть, то мы можем запустить запись, вызвав:
Или остановить запись при помощи:
Для проигрывания используем метод:
Для завершения вызываем:
Для вывода на экран понадобятся виджеты
Пакет также поддерживает различные слушатели для работы контроллеров, что делает его гибким и мощным инструментом для разработки.
Использовали ли вы пакет audio_waveforms в своих проектах? Расскажите о своем опыте в чате.
Установка и настройка
Для установки нам нужно подключить пакет и следуя инструкции из pub.dev добавить разрешение на использование микрофона для необходимых платформ.
Инициализация
Создаем поля для виджетов записи и воспроизведения аудио:
late final RecorderController recorderController;
late final PlayerController playerController
Инициализируем контроллеры:
@override
void initState() {
recorderController = RecorderController()
..androidEncoder = AndroidEncoder.aac
..androidOutputFormat = AndroidOutputFormat.mpeg4
..iosEncoder = IosEncoder.kAudioFormatMPEG4AAC
..sampleRate = 16000;
playerController = PlayerController();
super.initState();
}
Не забываем освобождать ресурсы:
@override
void dispose() {
recorderController.dispose();
playerController.dispose();
super.dispose();
}
Запись и воспроизведение
Для записи нужно проверить дал ли пользователь разрешение на использование микрофона:
final bool hasPermission = await recorderController.checkPermission();
Если оно у нас есть, то мы можем запустить запись, вызвав:
await recorderController.record();
Или остановить запись при помощи:
String pathAudio = await recorderController.stop() ?? '';
await playerController.preparePlayer(path: pathAudio);
Для проигрывания используем метод:
await playerController.startPlayer(finishMode: FinishMode.pause);
Для завершения вызываем:
await playerController.pausePlayer();
Для вывода на экран понадобятся виджеты
AudioWaveforms
и AudioFileWaveforms
. Они легко настраиваются с помощью полей waveStyle
и playerWaveStyle
, которые предлагают множество опций для кастомизации.
AudioWaveforms(
size: const Size(double.infinity, 50.0),
recorderController: recorderController,
),
Пакет также поддерживает различные слушатели для работы контроллеров, что делает его гибким и мощным инструментом для разработки.
Использовали ли вы пакет audio_waveforms в своих проектах? Расскажите о своем опыте в чате.
👍15🔥5💘2👏1
Hola, Amigos! На связи Михаил Чернецов, Flutter dev в Amiga. Сегодня расскажу про пакет auto_route, который создает роуты для приложения с помощью кодогенерации.
Он поддерживает deeplinks, с помощью которых можно открыть приложение на необходимой странице: например ссылка в письме, ведущая на сделанный пользователем заказ. А также Route Guard, который создатели библиотеки сравнивают с интерсептором для навигации, но о нем чуть позже.
Для создание конфигурации роутера необходимо создать класс роутера:
Для получения HomeRoute, необходимо пометить аннотацией
В роуты также можно передавать параметры, при этом сохраняются стандартные значения и учитывается наличие поля required.
Для того, что бы им можно было пользоваться, необходимо добавить роутер в приложение:
Далее с помощью extension над context можем получать router, имеющий такое же api как у navigator и так же использует навигацию через стек.
– maybePop — по возможности убирает последний роут из стека.
– push — добавляет в стек новый роут.
– replace — заменяет текущий роут на другой. При этом не меняет стек роутов.
– remove — убирает определенный роут из стека.
– navigate — если роут в стеке, убирает роуты до того, как попадется необходимый или добавляет роут в стек.
Большая часть остальных методов является просто комбинацией из этих 5-ти. Всем хорошего кода!
Делитесь в чате своим опытом работы с библиотекой.
Он поддерживает deeplinks, с помощью которых можно открыть приложение на необходимой странице: например ссылка в письме, ведущая на сделанный пользователем заказ. А также Route Guard, который создатели библиотеки сравнивают с интерсептором для навигации, но о нем чуть позже.
Для создание конфигурации роутера необходимо создать класс роутера:
@AutoRouterConfig()
class AppRouter extends $AppRouter {
@override
List<AutoRoute> get routes => [
AutoRoute(page: HomeRoute.page),
];
}
Для получения HomeRoute, необходимо пометить аннотацией
RoutePage HomeScreen
. Причем в стандартной настройке Screen и Page в названии страницы заменяются на Route
.
@RoutePage()
class HomeScreen extends StatefulWidget {}
В роуты также можно передавать параметры, при этом сохраняются стандартные значения и учитывается наличие поля required.
context.router.push(BookRoute(bookId: id));
Для того, что бы им можно было пользоваться, необходимо добавить роутер в приложение:
final _appRouter = AppRouter();
@override
Widget build(BuildContext context){
return MaterialApp.router(
routerConfig: _appRouter.config(),
);
}
Далее с помощью extension над context можем получать router, имеющий такое же api как у navigator и так же использует навигацию через стек.
– maybePop — по возможности убирает последний роут из стека.
– push — добавляет в стек новый роут.
– replace — заменяет текущий роут на другой. При этом не меняет стек роутов.
– remove — убирает определенный роут из стека.
– navigate — если роут в стеке, убирает роуты до того, как попадется необходимый или добавляет роут в стек.
Большая часть остальных методов является просто комбинацией из этих 5-ти. Всем хорошего кода!
Делитесь в чате своим опытом работы с библиотекой.
🔥8👍5👏3👎2❤1😢1