Hola, Amigos! На связи команда мобильной разработки продуктового агентства Amiga. Сегодня мы для вас подготовили 7 и 8 части перевода гайда о тестировании Flutter приложений.
И в новом выпуске рассмотрим 6 ошибок при написании кода, которые усложняют автоматическое тестирование:
1️⃣ Не использовать Dependency Injection (DI)
2️⃣ Использовать верхнеуровневые функции и переменные внутри метода, который тестируется
3️⃣ Вызывать функцию плагина, которая использует нативный код, внутри тестируемой функции
4️⃣ Не отделять логику от UI
5️⃣ Использовать DateTime.now()
6️⃣ Написать большую функцию или поделить ее на много маленьких
Надеемся, что эта статья даст вам больше знаний и опыта, чтобы лучше проектировать код для упрощения написания тестов и покрытия большего количества сценариев.
В следующей статье поговорим проbest practices при написании тестов . Ставьте 🔥, если ждете!
И в новом выпуске рассмотрим 6 ошибок при написании кода, которые усложняют автоматическое тестирование:
Надеемся, что эта статья даст вам больше знаний и опыта, чтобы лучше проектировать код для упрощения написания тестов и покрытия большего количества сценариев.
В следующей статье поговорим про
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥13❤4👏1🤨1
Hola, Amigos! Вы ждали, а мы ждали еще больше, чтобы скорее поделиться с вами записью доклада Паши Гершевича, нашего Mobile Team Lead Amiga, с конференции Mobius.
Немного освежим в памяти тему доклада — «Создание indoor-карты здания на Flutter». Паша рассказал, как реализовать размещение на одном или нескольких экранах внутренней карты здания. Рассмотрели подходы и собственное решение с использованием Flutter.
Держите ссылки:
⚙️ YOUTUBE
⚙️ VK
Смотрите на любой удобной платформе и делитесь в чате, на какую тему вы бы точно пришли на конференцию?🙂
Немного освежим в памяти тему доклада — «Создание indoor-карты здания на Flutter». Паша рассказал, как реализовать размещение на одном или нескольких экранах внутренней карты здания. Рассмотрели подходы и собственное решение с использованием Flutter.
Держите ссылки:
Смотрите на любой удобной платформе и делитесь в чате, на какую тему вы бы точно пришли на конференцию?
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11❤4🔥2👏2👨💻1
Hola, Amigos! На связи Павел Гершевич, Mobile Team Lead агентства продуктовой разработки Amiga. Поздравляю вас, коллеги, мы это сделали — это последняя серия нашего многосерийного сериала про тестирование Flutter приложений ⚙️
Напоследок разберем 9 лучших практик написания модульных тестов, которые помогут создавать более эффективные Unit-тесты. Оригинал оставлю тут, если вы вдруг знаете вьетнамский, а перевод на Habr 😄
Переходите по ссылке, читайте и пишите комментарии! Кажется, теперь мы с вами о тестировании Flutter-приложений знаем абсолютно всё.
Надеемся, этот материал принёс вам пользу и новые знания. Хорошего всем кода и легкого тестирования!⚙️
Напоследок разберем 9 лучших практик написания модульных тестов, которые помогут создавать более эффективные Unit-тесты. Оригинал оставлю тут, если вы вдруг знаете вьетнамский, а перевод на Habr 😄
Переходите по ссылке, читайте и пишите комментарии! Кажется, теперь мы с вами о тестировании Flutter-приложений знаем абсолютно всё.
Надеемся, этот материал принёс вам пользу и новые знания. Хорошего всем кода и легкого тестирования!
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥5❤2👍1🥱1
Hola, Amigos! На связи Павел Гершевич, Mobile Team Lead агентства продуктовой разработки Amiga. Сегодня обсудим аудит кода и безопасности мобильных приложений.
Рассказали в карточках:
– зачем делать аудит кода?
– что он включает в себя?
– как использовать результаты аудита?
Если возникнут вопросы, велком в наш чат.
Будем рады вам помочь и обсудить задачи по развитию ваших проектов!
Связаться с Amiga
Рассказали в карточках:
– зачем делать аудит кода?
– что он включает в себя?
– как использовать результаты аудита?
Если возникнут вопросы, велком в наш чат.
Будем рады вам помочь и обсудить задачи по развитию ваших проектов!
Связаться с Amiga
🔥5👍1🤩1
Руководство по deep links в Flutter-приложениях
Hola, Amigos!
На связи Павел Гершевич, Mobile Team Lead агентства продуктовой разработки Amiga. Сегодня обсудим deep links. Мы нашли интересные статьи у иностранного автора и делимся с вами переводами.
Что вы сможете сделать у себя в приложении после изучения гайда:
– Нажатие на ссылку похожую на
– Если вы используете кастомную схему, например
Переходите по ссылке и пишите комментарии, если было полезно, для нас это лучшая мотивация!
Hola, Amigos!
На связи Павел Гершевич, Mobile Team Lead агентства продуктовой разработки Amiga. Сегодня обсудим deep links. Мы нашли интересные статьи у иностранного автора и делимся с вами переводами.
Что вы сможете сделать у себя в приложении после изучения гайда:
– Нажатие на ссылку похожую на
https://your-domain.com/details
будет открывать определенный экран в вашем приложении.– Если вы используете кастомную схему, например
myscheme123://details
, то этот гайд не для вас. Тут лучше рассмотреть пакет app_links.Переходите по ссылке и пишите комментарии, если было полезно, для нас это лучшая мотивация!
🔥9❤2🎉2👍1
Hola, Amigos! На связи Flutter-команда агентства продуктовой разработки Amiga.
Недавно мы перевели для вас серию статей про модульное тестирование, но одна важная тема осталась за бортом. Сегодня познакомимся с тестированием BLoC при помощи модульных тестов.
В новой статье:
-возможности библиотеки bloc_test,
-примеры простых модульных тестов,
-примеры тестирования сложных событий.
Читайте по ссылке на Habr. Ставьте реакции, если было полезно!
А также делитесь в чате, с какими трудностями встречаетесь вы при тестировании приложений?
Недавно мы перевели для вас серию статей про модульное тестирование, но одна важная тема осталась за бортом. Сегодня познакомимся с тестированием BLoC при помощи модульных тестов.
В новой статье:
-возможности библиотеки bloc_test,
-примеры простых модульных тестов,
-примеры тестирования сложных событий.
Читайте по ссылке на Habr. Ставьте реакции, если было полезно!
А также делитесь в чате, с какими трудностями встречаетесь вы при тестировании приложений?
❤6❤🔥3🔥2👍1🥰1🙏1
Hola, Amigos!
29 и 30 августа пройдет крупнейшая конференция для руководителей студий и агентств BOOST. Уникальное мероприятие для digital-рынка представляет собой площадку для нетворкинга и шеринга знаний от лидеров индустрии.
5 потоков [впервые! дизайн и digital-маркетинг]
150+ спикеров
1000+ участников
Amiga представят спикеры:
⚙️ Дмитрий Тарасов, СЕО с докладом «Изменения в digital-продакшене при переориентировании на длинные деньги»
⚙️ Артем Салеев, технический директор с темой «Как избежать убытков, когда не попал в оценку?»
⚙️ Константин Франгуриди, Исполнительный директор модерирует направление Дизайн и креатив.
А еще мы подготовили кое-что интересное на нашем промо для всех участников конференции! Небольшой спойлер на картинке, а все подробности вы узнаете уже в этот четверг. Приходите! Будет интересно, полезно и увлекательно!
Пользуйтесь промокодомAMIGA10 для покупки билетов со скидкой 10%.
До встречи!
29 и 30 августа пройдет крупнейшая конференция для руководителей студий и агентств BOOST. Уникальное мероприятие для digital-рынка представляет собой площадку для нетворкинга и шеринга знаний от лидеров индустрии.
5 потоков [впервые! дизайн и digital-маркетинг]
150+ спикеров
1000+ участников
Amiga представят спикеры:
А еще мы подготовили кое-что интересное на нашем промо для всех участников конференции! Небольшой спойлер на картинке, а все подробности вы узнаете уже в этот четверг. Приходите! Будет интересно, полезно и увлекательно!
Пользуйтесь промокодом
До встречи!
Please open Telegram to view this post
VIEW IN TELEGRAM
❤🔥8🥰3👍2🔥1
Hola, Amigos! Что делаете 5-8 сентября? Поехали с нами в Омск на DevFest! Это ежегодная конференция для программистов, которая проводится с целью развития IT‑сообщества.
Будет интересно всем разработчикам: Android, Python, iOS, Web, Аврора, Flutter, Java, .NET, SRE, Documentation.
Мы участвуем уже второй год подряд и в этот раз Amiga будут представлять:
⚙️ Паша Гершевич, Flutter Team Lead с докладом «Логирование на Flutter или какие метрики помогут в оптимизации».
Разберём, зачем нужны логи разработчикам и тестировщикам. Как сделать логи информативнее. Какие метрики логировать в приложении и как это делать лучше всего. Где сохранять логи, чтобы их можно было спокойно посмотреть.
Доклад будет полезен Flutter-разработчикам уровня Middle и выше, а также их тестировщикам.
⚙️ Артем Салеев, Технический директор с темой «Перестройка процессов разработки при масштабировании агентства».
Поговорим о реорганизации структуры команды и внедрении инструментов автоматизации: от постановки задач до аналитики. Также сделаем акцент на перестройке себя: трансформации мышления и рефлексии.
Будет полезно техническим специалистам, которые хотят стать TeamLead, TeamLead Backend, CTO.
Конфа пройдет уже на следующей неделе, так что советуем поторопиться с билетами!
Промокод DEVFESTAMIGA даёт скидку 30% и действует до 6 сентября.
До встречи!🙂
Будет интересно всем разработчикам: Android, Python, iOS, Web, Аврора, Flutter, Java, .NET, SRE, Documentation.
Мы участвуем уже второй год подряд и в этот раз Amiga будут представлять:
Разберём, зачем нужны логи разработчикам и тестировщикам. Как сделать логи информативнее. Какие метрики логировать в приложении и как это делать лучше всего. Где сохранять логи, чтобы их можно было спокойно посмотреть.
Доклад будет полезен Flutter-разработчикам уровня Middle и выше, а также их тестировщикам.
Поговорим о реорганизации структуры команды и внедрении инструментов автоматизации: от постановки задач до аналитики. Также сделаем акцент на перестройке себя: трансформации мышления и рефлексии.
Будет полезно техническим специалистам, которые хотят стать TeamLead, TeamLead Backend, CTO.
Конфа пройдет уже на следующей неделе, так что советуем поторопиться с билетами!
До встречи!
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7❤🔥3❤2🔥1
Дайджест августа
Hola, Amigos! Собрали в одну подборку все полезные посты и статьи августа, которые вы могли пропустить. Выбирайте, что вам интересно, и переходите по ссылкам.
⚪️ 4 часть гайда тестирования в Flutter: Продвинутые методы тестирования
⚪️ 5 часть гайда тестирования в Flutter: Mocktail
⚪️ 6 часть гайда тестирования в Flutter: Faking vs Mocking
⚪️ Нововведения в Flutter 3.24
⚪️ Отображение HTML-тегов в Flutter
⚪️ 7-8 части гайда тестирования в Flutter: 6 ошибок при написании кода
🔴 Запись доклада «Создание indoor-карты здания на Flutter»
⚪️ 9 часть гайда тестирования в Flutter: лучшие практики написания Unit-тестов
⚪️ Аудит кода и безопасности мобильных приложений
⚪️ Руководство по deep links в Flutter-приложениях
⚪️ Тестирование BLoC
🔴 5-8 сентября DevFest в Омске. Промокод в посте
Всем хорошего кода и с началом золотой осени! 🍂
Hola, Amigos! Собрали в одну подборку все полезные посты и статьи августа, которые вы могли пропустить. Выбирайте, что вам интересно, и переходите по ссылкам.
Всем хорошего кода и с началом золотой осени! 🍂
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥7👍3❤1
Hola, Amigos!
На связи Михаил Чернецов, Flutter Dev агентства продуктовой разработки Amiga. Сегодня мы поговорим про Draggable, который позволяет перетаскивать виджет по всему пространству экрана.
При передвижении объекта под курсором отображается виджет, передаваемый в свойство feedback. Если необходимо изменить сам виджет, можно передать свойство в
Однако само перетаскивание виджета ничего не делает. Необходимо также предоставить ему место, куда его можно передвинуть. Этим занимается виджет DragTarget.
Необходимо предоставить ему билдер и опциональные callback
Однажды это нами было использовано, т.к. при драге виджета мы не можем использовать другие жесты, в том числе скролл. На верхней и нижней границе экрана были расположены два невидимых драг таргета, которые начинали движение ScrollController при срабатывании onMove и останавливали движение контроллера при срабатывании onLeave.
Из интересных применений Draggable является также оборачивание виджета в DragTarget. Его нельзя будет перетаскивать, но он будет реагировать на перетаскивание Draggable. Например, когда нужно сделать что-то наподобие ReorderableList, когда можно взять необходимый элемент, а остальные элементы обернуть в DragTarget.
Также существует виджет LongPressDraggable, который перетаскивается только при срабатывание на длительное нажатие и при этом триггерит
Всем хорошего кода! Делитесь в чате своим опытом работы с Draggable.
На связи Михаил Чернецов, Flutter Dev агентства продуктовой разработки Amiga. Сегодня мы поговорим про Draggable, который позволяет перетаскивать виджет по всему пространству экрана.
При передвижении объекта под курсором отображается виджет, передаваемый в свойство feedback. Если необходимо изменить сам виджет, можно передать свойство в
childWhenDragging
.
Draggable(
data: …, // Данные
feedback: Container(), // Виджет который перетаскивается
childWhenDragging: Container(), // Виджет который заменяет child, когда виджет перетаскивают, необязательный.
child: Container(), // Сам виджет
),
Однако само перетаскивание виджета ничего не делает. Необходимо также предоставить ему место, куда его можно передвинуть. Этим занимается виджет DragTarget.
Необходимо предоставить ему билдер и опциональные callback
onWillAcceptWithDetails
, отвечающий за приём Draggable widget и отработку onAcceptWithDetails
. onMove
и onLeave
— интересные callback, т.к. реагируют не на то, что Draggable был туда передан, а на появление в этой области Draggable.
DragTarget(
builder: (BuildContext context, List<dynamic> _, List<dynamic> _,) {
return Container();
},
onAcceptWithDetails: (DragTargetDetails details) {
…
},
),
Однажды это нами было использовано, т.к. при драге виджета мы не можем использовать другие жесты, в том числе скролл. На верхней и нижней границе экрана были расположены два невидимых драг таргета, которые начинали движение ScrollController при срабатывании onMove и останавливали движение контроллера при срабатывании onLeave.
Из интересных применений Draggable является также оборачивание виджета в DragTarget. Его нельзя будет перетаскивать, но он будет реагировать на перетаскивание Draggable. Например, когда нужно сделать что-то наподобие ReorderableList, когда можно взять необходимый элемент, а остальные элементы обернуть в DragTarget.
Также существует виджет LongPressDraggable, который перетаскивается только при срабатывание на длительное нажатие и при этом триггерит
hapticFeedback
(вибрацию).Всем хорошего кода! Делитесь в чате своим опытом работы с Draggable.
👍11❤3🔥2🙏2
Hola, Amigos!
На связи Павел Гершевич, Mobile Team Lead агентства продуктовой разработки Amiga. Сегодня обсудим кастомизацию иконок по формам и цветам на Flutter. Особенно интересно рассмотреть кейсы с Android выше 12 версии и iOS 18, который пока еще в бете.
Конечно, можно использовать библиотеку flutter_launcher_icons, о которой мы уже рассказывали, но она пока не работает с новыми иконками для iOS. Изменение иконки у приложения — задача достаточно редкая. Давайте посмотрим, как это можно сделать вручную.
👾 Начнем с Android. Можно создать статичные иконки (прямоугольные и круглые), динамическую форму и монохромные, чтобы потом менять цвет.
Для этого понадобится цвет фона или сам фон (только для статичных и динамической формы) и объект на передний план. Всё это в векторе.
Если используем статичные картинки, то их можно подготовить и сделать нужных размеров вручную или при помощи специальных генераторов. Добавляем их в папки /android/app/src/main/res/mipmap-xxxx/ (xxxx заменить на нужный размер) под именами ic_launcher и ic_launcher_round. Далее вписываем код в AndroidManifest:
Если хотим динамические картинки, то можно воспользоваться встроенным инструментом в Android Studio. Для этого откройте папку Android вашего проекта как отдельный проект. После нажмите правой кнопкой мыши на res и выберите New -> Image Asset.
Далее выбираем картинку в Foreground и фон в Background. И Android Studio все сделает сама.
Теперь перейдем в res/drawables/anydpi-v26/ic_launcher.xml и добавим монохромную версию. Если она у вас будет отличаться от фона стандартной, то сначала добавьте свое изображение.
🤖 На iOS все проще. С приходом iOS 18 придет еще 2 типа иконок: для темного режима (Dark) и окрашенные (Tinted).
Лучше всего попросить дизайнера сделать эти 2 типа иконок и изменить их размер, чтобы вставить в Xcode. Сейчас это делается через Xcode Beta. Для темной темы и окраски можно обойтись прозрачными изображениями в отличии от светлой темы.
Всем хорошего кода! Пишите в чате, как вы кастомизируете иконки на Flutter?
На связи Павел Гершевич, Mobile Team Lead агентства продуктовой разработки Amiga. Сегодня обсудим кастомизацию иконок по формам и цветам на Flutter. Особенно интересно рассмотреть кейсы с Android выше 12 версии и iOS 18, который пока еще в бете.
Конечно, можно использовать библиотеку flutter_launcher_icons, о которой мы уже рассказывали, но она пока не работает с новыми иконками для iOS. Изменение иконки у приложения — задача достаточно редкая. Давайте посмотрим, как это можно сделать вручную.
👾 Начнем с Android. Можно создать статичные иконки (прямоугольные и круглые), динамическую форму и монохромные, чтобы потом менять цвет.
Для этого понадобится цвет фона или сам фон (только для статичных и динамической формы) и объект на передний план. Всё это в векторе.
Если используем статичные картинки, то их можно подготовить и сделать нужных размеров вручную или при помощи специальных генераторов. Добавляем их в папки /android/app/src/main/res/mipmap-xxxx/ (xxxx заменить на нужный размер) под именами ic_launcher и ic_launcher_round. Далее вписываем код в AndroidManifest:
<application
...
android:icon="@mipmap/ic_launcher"
android:roundIcon="@mipmap/ic_launcher_round"
...>
</application>
Если хотим динамические картинки, то можно воспользоваться встроенным инструментом в Android Studio. Для этого откройте папку Android вашего проекта как отдельный проект. После нажмите правой кнопкой мыши на res и выберите New -> Image Asset.
Далее выбираем картинку в Foreground и фон в Background. И Android Studio все сделает сама.
Теперь перейдем в res/drawables/anydpi-v26/ic_launcher.xml и добавим монохромную версию. Если она у вас будет отличаться от фона стандартной, то сначала добавьте свое изображение.
<monochrome android:drawable="@drawable/ic_launcher_foreground" />
🤖 На iOS все проще. С приходом iOS 18 придет еще 2 типа иконок: для темного режима (Dark) и окрашенные (Tinted).
Лучше всего попросить дизайнера сделать эти 2 типа иконок и изменить их размер, чтобы вставить в Xcode. Сейчас это делается через Xcode Beta. Для темной темы и окраски можно обойтись прозрачными изображениями в отличии от светлой темы.
Всем хорошего кода! Пишите в чате, как вы кастомизируете иконки на Flutter?
🔥10👍5❤2🤩1
Hola, Amigos!
На связи Павел Гершевич, Mobile Team Lead агентства продуктовой разработки Amiga. Сегодня рассмотрим плагин local_auth. Он помогает добавить в приложение вход через биометрию — отпечаток пальца или лицо.
Для начала работы нужно указать, что приложение использует эту функциональность, и пользователь может дать разрешение на нее. Для Android в AndroidManifest.xml:
Для iOS в info.plist:
Когда пользователь доходит до момента включения биометрии, то нужно проверить доступна ли она. Если всё работает, то можно выбрать, что показать на экране: иконку отпечатка или иконку FaceID. На некоторых Android смартфонах могут быть доступны оба типа.
Чтобы запросить биометрию, выполним следующий код:
Но у этого плагина также есть и минусы, о которых мы поговорим на конференции «Стачка» 27-28 сентября в Санкт-Петербурге.
Промокод«спикер_10» подарит вам скидку 10% на билет 🎁
До встречи на конференции!
На связи Павел Гершевич, Mobile Team Lead агентства продуктовой разработки Amiga. Сегодня рассмотрим плагин local_auth. Он помогает добавить в приложение вход через биометрию — отпечаток пальца или лицо.
Для начала работы нужно указать, что приложение использует эту функциональность, и пользователь может дать разрешение на нее. Для Android в AndroidManifest.xml:
<uses-permission android:name="android.permission.USE_BIOMETRIC"/>
Для iOS в info.plist:
<key>NSFaceIDUsageDescription</key>
<string>Причина использования</string>
Когда пользователь доходит до момента включения биометрии, то нужно проверить доступна ли она. Если всё работает, то можно выбрать, что показать на экране: иконку отпечатка или иконку FaceID. На некоторых Android смартфонах могут быть доступны оба типа.
final LocalAuthentication auth = LocalAuthentication();
final canAuthenticateWithBiometrics = await auth.canCheckBiometrics;
final isDeviceSupported = await auth.isDeviceSupported();
if (canAuthenticateWithBiometrics || isDeviceSupported) {
final availableBiometrics = await auth.getAvailableBiometrics();
if (availableBiometrics.contains(BiometricType.face)) {
... // Показываем иконку с лицом
} else if (availableBiometrics.contains(BiometricType.fingerprint)) {
... // Показываем иконку с отпечатком пальца
}
... // Другие действия для выполнения биометрии
}
Чтобы запросить биометрию, выполним следующий код:
try {
final didAuthenticate = await auth.authenticate(
localizedReason: 'Зачем пользователю ',
options: const AuthenticationOptions(biometricOnly: true),
);
... // Другие действия
} catch (e) {
... // Обработка ошибок
}
Но у этого плагина также есть и минусы, о которых мы поговорим на конференции «Стачка» 27-28 сентября в Санкт-Петербурге.
Промокод
До встречи на конференции!
👍15🔥4🎉2👏1