Hola, Amigos! С наступающим Новым годом🎄
2024 год подходит к концу — быстрый, шумный и полный интересных задач и открытий! Мы вместе с вами писали тысячи строк кода и учились новому. А сейчас отличное время, чтобы сделать паузу и набраться сил для будущих свершений🥂
Желаем, чтобы в 2025 у вас все легко складывалось: код работал стабильно, проекты вдохновляли, а идеи приходили сами собой❤️
Не забывайте находить баланс, отдыхать и наполняться энергией, и до встречи в Новом году!
2024 год подходит к концу — быстрый, шумный и полный интересных задач и открытий! Мы вместе с вами писали тысячи строк кода и учились новому. А сейчас отличное время, чтобы сделать паузу и набраться сил для будущих свершений🥂
Желаем, чтобы в 2025 у вас все легко складывалось: код работал стабильно, проекты вдохновляли, а идеи приходили сами собой❤️
Не забывайте находить баланс, отдыхать и наполняться энергией, и до встречи в Новом году!
🎉9❤5🔥4🎄2
Hola, Amigos! Сегодня поговорим о подходах к проектированию состояний в BLoC. В Flutter существует два основных подхода для создания состояний: single state и state machine.
📍 Single state
Это класс, содержащий все возможные поля, описывающие состояние BLoC. При изменении любого из этих полей мы создаем новое состояние, полностью обновляя текущий state.
Пример:
Использование метода emit для изменения состояния:
📍 State machine
В этом подходе каждое состояние представлено отдельным классом, унаследованным от общего родительского. Похожим способом в BLoC обычно создают события:
Для использования такого подхода в BLoC можно эмитить конкретные состояния:
Какой из этих подходов выбрать — зависит от сложности логики вашего приложения. State machine лучше подходит для сложных сценариев с разными типами состояний, тогда как single state — для простых случаев с минимальными изменениями.
Какой подход вам ближе? Пишите в комментариях!
📍 Single state
Это класс, содержащий все возможные поля, описывающие состояние BLoC. При изменении любого из этих полей мы создаем новое состояние, полностью обновляя текущий state.
Пример:
class MyBlocState{
final List<Todo> todos;
final bool loading;
final String? failure;
…
}
Использование метода emit для изменения состояния:
emit(MyBlocState.copyWith(
loading: true,
));
📍 State machine
В этом подходе каждое состояние представлено отдельным классом, унаследованным от общего родительского. Похожим способом в BLoC обычно создают события:
abstract class MyBlocState{}
class LoadingState extends MyBlocState{}
class LoadedState extends MyBlocState{
final List<Todo> todos;
…
}
class FailureState extends MyBlocState{
final String failure;
…
}
Для использования такого подхода в BLoC можно эмитить конкретные состояния:
emit(LoadingState());
Какой из этих подходов выбрать — зависит от сложности логики вашего приложения. State machine лучше подходит для сложных сценариев с разными типами состояний, тогда как single state — для простых случаев с минимальными изменениями.
Какой подход вам ближе? Пишите в комментариях!
👍9❤5🔥5
Hola, Amigos! На связи команда агентства продуктовой разработки Amiga. Сегодня поделимся полезной статьей Flutter-разработчика из Agima и обсудим важную тему — CodeStyle на Flutter-проектах. Единые правила кода помогают избежать хаоса в долгосрочных проектах, где каждый разработчик приносит свой стиль.
Почему это важно?
1. Улучшает читаемость и поддержку кода.
2. Ускоряет ревью и уменьшает ошибки.
3. Упрощает ввод новых участников в команду.
В материале подробно о принципах написания читаемого кода, работе с форматированием и использовании автоматических линтеров⚙️
Ссылка на статью на Habr ⬅️
А вы внедряли CodeStyle на своих проектах? Делитесь в комментариях!
Почему это важно?
1. Улучшает читаемость и поддержку кода.
2. Ускоряет ревью и уменьшает ошибки.
3. Упрощает ввод новых участников в команду.
В материале подробно о принципах написания читаемого кода, работе с форматированием и использовании автоматических линтеров
Ссылка на статью на Habr ⬅️
А вы внедряли CodeStyle на своих проектах? Делитесь в комментариях!
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥8👍1
Hola, Amigos! На связи Павел Гершевич, Mobile Team Lead в Amiga. Сегодня мы поговорим, что делать, если нам нужно совершать какие-либо действия при открытии и закрытии клавиатуры.
Начнем с того, как понять, открыта ли клавиатура. Тут есть несколько методов — через
MediaQuery
У этого способа есть большой минус — он не работает на комплексной верстке, а наши приложения чаще всего такие.
WidgetBindings
Второй способ сложнее, но надежнее. Сначала мы должны добавить к нашему классу WidgetBindingsObserver.
Далее подключаем все:
Но и этот метод не идеален, так как не сможем получить высоту клавиатуры, если это необходимо.
Библиотеки
Тут достаточно большой выбор таких библиотек. Но наш совет — выбирать те, у которых много скачиваний, они чаще работают.
Во второй части мы расскажем, зачем это нужно и какие библиотеки выбрали мы. Делитесь в чате, были ли у вас случаи, когда нужно было отслеживать клавиатуру?
Начнем с того, как понять, открыта ли клавиатура. Тут есть несколько методов — через
MediaQuery
, через WidgetBindings
и через библиотеки.MediaQuery
final bottomInset = MediaQuery.of(context).viewInsets.bottom;
if (bottomInset == 0) {
// клавиатура закрыта
} else {
// клавиатура открыта
}
У этого способа есть большой минус — он не работает на комплексной верстке, а наши приложения чаще всего такие.
WidgetBindings
Второй способ сложнее, но надежнее. Сначала мы должны добавить к нашему классу WidgetBindingsObserver.
class _MyWidgetState extends State<MyWidget> with WidgetBindingsObserver {
...
}
Далее подключаем все:
@override
void initState() {
super.initState();
WidgetBindings.addObserver(this);
}
@override
void dispose() {
WidgetBindings.removeObserver(this);
super.dispose();
}
@override
didChangeMetrics() {
super.didChangeMetrics();
final isKeyboardOpen = WidgetsBinding.instance.window.viewInsets.bottom > 0;
}
Но и этот метод не идеален, так как не сможем получить высоту клавиатуры, если это необходимо.
Библиотеки
Тут достаточно большой выбор таких библиотек. Но наш совет — выбирать те, у которых много скачиваний, они чаще работают.
Во второй части мы расскажем, зачем это нужно и какие библиотеки выбрали мы. Делитесь в чате, были ли у вас случаи, когда нужно было отслеживать клавиатуру?
👍8🔥3🗿3❤1
Hola, Amigos! На связи Павел Гершевич, Mobile Team Lead в Amiga. Сегодня мы еще немного обсудим с вами отслеживание включения клавиатуры устройства.
Случаи, когда нам нужно отслеживать
1. Если мы работаем с виджетом, который плохо складывается. Например, платформенные виджеты. В одном из наших кейсов на WebView располагалось текстовое поле, которое на Android начало уходить под клавиатуру. В этом случае мы использовали отслеживание для добавления отступов, что помогло справиться с проблемой.
2. Чтобы выводить дополнительные виджеты сразу над клавиатурой, если она открыта. Например, список emoji или что-то подобное. А также менять что-либо на экране, если нам нужно.
3. Это может быть одним из способов отслеживания, пишет ли пользователь что-то в чат. Все же видели надписи «печатает…» в мессенджерах.
Как мы получили высоту клавиатуры
Так как у нас не получилось сжимать WebView автоматически, мы решили прибегнуть к отслеживанию. Попробовав способы из первой части, мы поняли, что они нам не подходят. Поэтому долго выбирали библиотеку, которая подойдет. Вот несколько:
keyboard_height_plugin — позволяет отслеживать не только, открыта ли клавиатура, но и ее высоту. Именно эту библиотеку мы выбрали в итоге.
flutter_keyboard_visibility — самая популярная библиотека, но достаточно сложная в подключении.
Именно эти 2 пакета мы можем порекомендовать к использованию в своих проектах.
Теперь давайте посмотрим, как мы организовали отслеживание. Наш виджет уже и так был
И в методе
Не забываем, что сам объект нужно разрушить вместе с виджетом, поэтому добавляем в
Теперь можно применить новую переменную для отступа.
Делитесь в чате, были ли у вас похожие случаи?
Случаи, когда нам нужно отслеживать
1. Если мы работаем с виджетом, который плохо складывается. Например, платформенные виджеты. В одном из наших кейсов на WebView располагалось текстовое поле, которое на Android начало уходить под клавиатуру. В этом случае мы использовали отслеживание для добавления отступов, что помогло справиться с проблемой.
2. Чтобы выводить дополнительные виджеты сразу над клавиатурой, если она открыта. Например, список emoji или что-то подобное. А также менять что-либо на экране, если нам нужно.
3. Это может быть одним из способов отслеживания, пишет ли пользователь что-то в чат. Все же видели надписи «печатает…» в мессенджерах.
Как мы получили высоту клавиатуры
Так как у нас не получилось сжимать WebView автоматически, мы решили прибегнуть к отслеживанию. Попробовав способы из первой части, мы поняли, что они нам не подходят. Поэтому долго выбирали библиотеку, которая подойдет. Вот несколько:
keyboard_height_plugin — позволяет отслеживать не только, открыта ли клавиатура, но и ее высоту. Именно эту библиотеку мы выбрали в итоге.
flutter_keyboard_visibility — самая популярная библиотека, но достаточно сложная в подключении.
Именно эти 2 пакета мы можем порекомендовать к использованию в своих проектах.
Теперь давайте посмотрим, как мы организовали отслеживание. Наш виджет уже и так был
Stateful
, поэтому работ проводилось немного. Сначала мы добавили объект из библиотеки и создали переменную под размер самой клавиатуры:final _keyboardHeightPlugin = KeyboardHeightPlugin();
double _keyboardHeight = 0;
И в методе
initState
подписались на изменения через callback:_keyboardHeightPlugin.onKeyboardHeightChanged((double height) {
setState(() {
_keyboardHeight = height;
});
});
Не забываем, что сам объект нужно разрушить вместе с виджетом, поэтому добавляем в
dispose
вот такой вызов:_keyboardHeightPlugin.dispose();
Теперь можно применить новую переменную для отступа.
Делитесь в чате, были ли у вас похожие случаи?
👍9🔥6
Hola, Amigos! Начинаем год с выступлений и зовем вас с собой😍 Присоединяйтесь к нам на FlutterConf — первую Flutter-конференцию в России!
📅 Дата: 21 февраля 2025 года
📍 Место: Москва, 3-я ул. Ямского Поля, 26А
В программе:
• Два потока докладов про реальные кейсы с нестандартными требованиями, архитектурные решения и инструменты для Flutter-проектов.
• Нетворкинг-события — завести полезные знакомства и найти новых единомышленников.
• Экспертная зона — обсудить конкретные вопросы с профессионалами, получить практический совет и понять, как расти в профессии.
• Круглый стол: прошлое, настоящее и будущее Flutter.
• AfterParty, где получится неформально пообщаться с коллегами.
Некоторые из докладов конференции:
→ Павел Гершевич. Mobile TeamLead, Amiga. Доклад: «Многомодульность в Flutter 2.0. Все подходы и что нового»
→ Станислав Чернышев. Доцент СПбГУАП, автор книги «Основы Dart». Доклад: «Жизненный цикл фичи в Dart: от issue до релиза»
→ Максим Ясаков. Flutter-разработчик, Яндекс. Доклад: «ArtVM: встроенная виртуальная микро среда исполнения для Dart»
Полный список тем, подробности и регистрация по ссылке: FlutterConf 2025
Промокод Amiga10 даёт скидку 10% на покупку билетов🔥
До встречи! 🙂
📅 Дата: 21 февраля 2025 года
📍 Место: Москва, 3-я ул. Ямского Поля, 26А
В программе:
• Два потока докладов про реальные кейсы с нестандартными требованиями, архитектурные решения и инструменты для Flutter-проектов.
• Нетворкинг-события — завести полезные знакомства и найти новых единомышленников.
• Экспертная зона — обсудить конкретные вопросы с профессионалами, получить практический совет и понять, как расти в профессии.
• Круглый стол: прошлое, настоящее и будущее Flutter.
• AfterParty, где получится неформально пообщаться с коллегами.
Некоторые из докладов конференции:
→ Павел Гершевич. Mobile TeamLead, Amiga. Доклад: «Многомодульность в Flutter 2.0. Все подходы и что нового»
→ Станислав Чернышев. Доцент СПбГУАП, автор книги «Основы Dart». Доклад: «Жизненный цикл фичи в Dart: от issue до релиза»
→ Максим Ясаков. Flutter-разработчик, Яндекс. Доклад: «ArtVM: встроенная виртуальная микро среда исполнения для Dart»
Полный список тем, подробности и регистрация по ссылке: FlutterConf 2025
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥7❤6👍4
Дайджест января
Hola, Amigos! Собрали в одну подборку все полезные посты с декабря до января, которые вы могли пропустить. Выбирайте, что интересно, и переходите по ссылкам:
⚪️ Connectivity во Flutter
⚪️ Итоги FlutterInProduction
⚪️ FlutterDevPodcast: Многомодульность во Flutter
⚪️ Single State vs State Machine
⚪️ Статья: «Кастомный трансофрмер для BloC»
⚪️ CodeStyle на Flutter-проектах
⚪️ Действия при открытии и закрытии клавиатуры (ч.1)
⚪️ Действия при открытии и закрытии клавиатуры (ч.2)
⚪️ И еще кое-что... Приглашаем на крупнейшую конференцию FlutterConf 🔥 И напоминаем, что с нашим промокодом Amiga10 вы получите скидку 10% на покупку билета!
Всем хорошего кода!
Hola, Amigos! Собрали в одну подборку все полезные посты с декабря до января, которые вы могли пропустить. Выбирайте, что интересно, и переходите по ссылкам:
Всем хорошего кода!
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥7👍3❤2
Hola, Amigos! На связи Павел Гершевич, Mobile Team Lead в Amiga. Иногда при запросах к серверу нам не хватает заголовков, и нужно использовать Cookies, хотя это что-то из мира Web-разработки.
Cookies — данные, которые нам отдает сервер, чтобы при дальнейших запросах мы их вернули. Это может использоваться для:
⚙️ аутентификации пользователя;
⚙️ определения сессий (например, мы определяем, что пользователь открыл приложении и пользуется им);
⚙️ хранение каких-либо данных (например, корзины).
Давайте рассмотрим, как мы можем с ними работать на Flutter.
Если мы используем пакет http или его производные, то нам понадобится библиотека cookie_jar. В случае работы с dio, есть dio_cookie_manager. Работают они одинаково — вторая библиотека это надстройка над первой.
Сначала нужно определить, как будут храниться наши Cookie. Существует 2 варианта — обычный
Давайте создадим PersistentCookieJar и добавим его к dio:
Так мы получаем путь к любому месту хранения, но рекомендую использовать папку приложения, и в ней создавать папку
Если установлен параметр
Делитесь в чате, добавляли работу с Cookies на своих проектах?
Cookies — данные, которые нам отдает сервер, чтобы при дальнейших запросах мы их вернули. Это может использоваться для:
Давайте рассмотрим, как мы можем с ними работать на Flutter.
Если мы используем пакет http или его производные, то нам понадобится библиотека cookie_jar. В случае работы с dio, есть dio_cookie_manager. Работают они одинаково — вторая библиотека это надстройка над первой.
Сначала нужно определить, как будут храниться наши Cookie. Существует 2 варианта — обычный
CookieJar
, который сохраняет в ОЗУ, и PersistentCookieJar
, который сохраняет в постоянную память.Давайте создадим PersistentCookieJar и добавим его к dio:
Future<void> prepareJar() async {
final Directory appDocDir = await getApplicationDocumentsDirectory();
final String appDocPath = appDocDir.path;
final jar = PersistCookieJar(
ignoreExpires: true,
storage: FileStorage(appDocPath + "/.cookies/"),
);
dio.interceptors.add(CookieManager(jar));
}
Так мы получаем путь к любому месту хранения, но рекомендую использовать папку приложения, и в ней создавать папку
/.cookies/
, чтобы директория была скрыта от посторонних глаз.Если установлен параметр
ignoreExpires
, то значит приложение или библиотека игнорируют срок годности Cookie и продолжают его использовать, даже если он истек.Делитесь в чате, добавляли работу с Cookies на своих проектах?
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥7👍4❤3
Hola, Amigos! На связи Михаил Чернецов, Flutter Dev в Amiga. Сегодня расскажем, как работать с файлами cookie в WebView на Flutter. Мы рассмотрим два популярных пакета для работы — webview_flutter и flutter_inappwebview, которые предоставляют схожий функционал. Рассмотрим работу с куки в webview_flutter:
Для использование cookie в flutter_inappwebview используется похожая схема работы с куками:
Главное отличие второго пакета в том, что он позволяет не только устанавливать файлы cookie, но и получать уже существующие, что удобно для дальнейшей логики в приложении.
Делитесь в чате кейсами работы с Cookies на своих проектах!
final cookieManager = WebViewCookieManager();
// устанавливаем cookie с именем test и значением тест на наш хост.
cookieManager.setCookie(
WebViewCookie(
name: “test”,
value: “test”,
domain: “https://example.com”,
),
);
Для использование cookie в flutter_inappwebview используется похожая схема работы с куками:
final cookieManager = CookieManager.instance();
cookieManager.setCookie(
url: WebUrl(“https://example.com”)
name: “test”,
value: “test”,
),
Главное отличие второго пакета в том, что он позволяет не только устанавливать файлы cookie, но и получать уже существующие, что удобно для дальнейшей логики в приложении.
List<Cookie> cookies = await cookieManager.getCookies(url: WebUrl(“https://example.com”));
Делитесь в чате кейсами работы с Cookies на своих проектах!
👍3❤2🔥2🤝1
Hola, Amigos! Принимаем поздравления, нам исполнилось 4 года🥳
В этом году мы достигли значительных успехов, и каждый шаг делал нас только сильнее и увереннее. Давайте вспомним, какие важные моменты произошли в нашем пути за 2024 год:
⚙️ Взяли 72 интересных проекта, это в 2 раза больше, чем в прошлом году;
⚙️ Обновили корпоративный сайт, и теперь улучшаем его для максимального удобства;
⚙️ Наш канал Flutter.Много вырос на 50%;
⚙️ Поучаствовали в 10 масштабных мероприятиях;
⚙️ Завоевали 2 и 3 место на премии CrossConf Awards и серебро и бронзу на Tagline Awards в номинации «Лучшее мобильное MVP-приложение» с кейсом разработки мобильного приложения для сети «Аптека Ваша №1» и в номинации «Лучший маркетплейс» с кейсом создания первого маркетплейса горного оборудования в России;
⚙️ Запустили новые площадки для разработки;
⚙️ Оптимизировали процессы;
⚙️ Улучшили продуктовый подход и расширили спектр услуг;
⚙️ Научились делать больше с меньшими затратами ресурсов, стали эффективнее и сильнее.
С каждым годом количество крупных клиентов и сложных интересных проектов увеличивается, а значит — нам доверяют.
Спасибо всей команде, клиентам и партнёрам — без вас этот путь был бы невозможен! А мы замотивированы расти и не останавливаться, поэтому stay tuned❤️
В этом году мы достигли значительных успехов, и каждый шаг делал нас только сильнее и увереннее. Давайте вспомним, какие важные моменты произошли в нашем пути за 2024 год:
С каждым годом количество крупных клиентов и сложных интересных проектов увеличивается, а значит — нам доверяют.
Спасибо всей команде, клиентам и партнёрам — без вас этот путь был бы невозможен! А мы замотивированы расти и не останавливаться, поэтому stay tuned
Please open Telegram to view this post
VIEW IN TELEGRAM
🎉17👍7❤4🔥3🤝1
Hola, Amigos! В день всех влюбленных подготовили для вас карточки с поздравлениями💖
Отправляйте близким, сохраняйте и пишите в комментариях, как ещё можно признаться в любви, если работаешь в IT:)
Отправляйте близким, сохраняйте и пишите в комментариях, как ещё можно признаться в любви, если работаешь в IT:)
Please open Telegram to view this post
VIEW IN TELEGRAM
❤13🥰6💘3👍1👎1