Flutter. Много
2.76K subscribers
332 photos
23 videos
257 links
Заказать мобильную разработку: https://amiga.agency/?utm_source=tg
Заказать рекламу в канале @amiga_agency_bot

Новости Flutter-разработки, дайджесты мероприятий, личный опыт.
Download Telegram
Hola, Amigos! На связи мобильная команда агентства продуктовой разработки Amiga. Вчера прошла презентация FlutterInProduction, где рассмотрели всю десятилетнюю историю нашего любимого фреймворка Flutter.

Да, мы ничего не перепутали, Flutter в этом году исполнилось 10 лет, хотя в самом начале он назывался по-другому и работал только на Android. Весь этот срок Google разделили на 3 фазы:

▫️2014-2018 — экспериментальная фаза

▫️2018-2022 — фаза роста

▫️2022-наст.время — фаза работы в продакшене

Наш Mobile Team Lead Павел Гершевич застал все 3 фазы, поэтому делимся его комментарием:

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


Кроме истории самого фреймворка и историй разработчиков, которые его используют, Google поделились некоторыми планами на наступающий 2025 год:

- Выпуск Impeller для десктопа;
- Появление Preview для виджетов, чтобы видеть верстку до запуска приложения;
- Прямой запуск нативных функций операционных систем без надобности писать Platform Channel;
- Упрощение написания виджетов при помощи добавления декораторов;
- Полный переход на Swift Package Manager для iOS.

Делитесь в чате, когда вы пришли в Flutter и как, по-вашему, он изменился с тех пор.
🔥6👍42
Hola Amigos! Мы так долго ждали и наконец можем поделиться с вами классной новостью😍

🔥Вышел свежий выпуск Flutter Dev Podcast с участием руководителя нашей команды мобильной разработки Павла Гершевича, в котором он вместе с коллегами по рынку обсудил, что нужно знать о многомодульности во Flutter.

В выпуске:

⚙️ Когда и зачем переходить на многомодульность

⚙️ Как правильно подготовить архитектуру приложения

⚙️ Какие инструменты, например Melos, помогут на этом пути

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

Слушать на сайте | Яндекс.Музыка | Spotify | YouTube | Звук | Apple Podcasts | Deezer | CastBox | Overcast | Pocket Casts | Podcast Addict | VK | Саундстрим | Mave-плеер

Делитесь впечатлениями и задавайте вопросы в чате ❤️
Please open Telegram to view this post
VIEW IN TELEGRAM
75🔥5👌1
Hola, Amigos! На связи команда агентства продуктовой разработки Amiga.

Павел Гершевич, наш Mobile Team Lead написал подробную статью для тех, кто работает с BLoC. В ней вы найдете:

⚙️ Разбор встроенных трансформеров — concurrent, sequential, droppable, restartable.

⚙️ Пример создания кастомного трансформера с debounce для оптимизации работы с событиями.

⚙️ Идеи для разработки сложных трансформеров для объединения и обработки нескольких потоков событий.

Ссылка на статью на Habr ⬅️

Делитесь в чате, кто уже создавал свои трансформеры?
Please open Telegram to view this post
VIEW IN TELEGRAM
9🔥6👍5🥰2
Hola, Amigos! С наступающим Новым годом🎄

2024 год подходит к концу — быстрый, шумный и полный интересных задач и открытий! Мы вместе с вами писали тысячи строк кода и учились новому. А сейчас отличное время, чтобы сделать паузу и набраться сил для будущих свершений🥂

Желаем, чтобы в 2025 у вас все легко складывалось: код работал стабильно, проекты вдохновляли, а идеи приходили сами собой❤️

Не забывайте находить баланс, отдыхать и наполняться энергией, и до встречи в Новом году!
🎉95🔥4🎄2
Hola, Amigos! Сегодня поговорим о подходах к проектированию состояний в BLoC. В Flutter существует два основных подхода для создания состояний: single state и state machine.

📍 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 — для простых случаев с минимальными изменениями.

Какой подход вам ближе? Пишите в комментариях!
👍95🔥5
Hola, Amigos! На связи команда агентства продуктовой разработки Amiga. Сегодня поделимся полезной статьей Flutter-разработчика из Agima и обсудим важную тему — CodeStyle на Flutter-проектах. Единые правила кода помогают избежать хаоса в долгосрочных проектах, где каждый разработчик приносит свой стиль.

Почему это важно?
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 и через библиотеки.

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🗿31
Hola, Amigos! На связи Павел Гершевич, Mobile Team Lead в Amiga. Сегодня мы еще немного обсудим с вами отслеживание включения клавиатуры устройства.

Случаи, когда нам нужно отслеживать

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% на покупку билетов🔥

До встречи! 🙂
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥76👍4
Дайджест января

Hola, Amigos! Собрали в одну подборку все полезные посты с декабря до января, которые вы могли пропустить. Выбирайте, что интересно, и переходите по ссылкам:

⚪️ Connectivity во Flutter

⚪️ Итоги FlutterInProduction

⚪️ FlutterDevPodcast: Многомодульность во Flutter

⚪️ Single State vs State Machine

⚪️ Статья: «Кастомный трансофрмер для BloC»

⚪️ CodeStyle на Flutter-проектах

⚪️ Действия при открытии и закрытии клавиатуры (ч.1)

⚪️ Действия при открытии и закрытии клавиатуры (ч.2)

⚪️И еще кое-что... Приглашаем на крупнейшую конференцию FlutterConf🔥 И напоминаем, что с нашим промокодом Amiga10 вы получите скидку 10% на покупку билета!

Всем хорошего кода!
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥7👍32
Hola, Amigos! На связи Павел Гершевич, Mobile Team Lead в Amiga. Иногда при запросах к серверу нам не хватает заголовков, и нужно использовать Cookies, хотя это что-то из мира Web-разработки.

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👍43
Hola, Amigos! На связи Михаил Чернецов, Flutter Dev в Amiga. Сегодня расскажем, как работать с файлами cookie в WebView на Flutter. Мы рассмотрим два популярных пакета для работы — webview_flutter и flutter_inappwebview, которые предоставляют схожий функционал. Рассмотрим работу с куки в webview_flutter:

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 на своих проектах!
👍32🔥2🤝1
Hola, Amigos! Принимаем поздравления, нам исполнилось 4 года🥳

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

⚙️ Взяли 72 интересных проекта, это в 2 раза больше, чем в прошлом году;
⚙️ Обновили корпоративный сайт, и теперь улучшаем его для максимального удобства;
⚙️ Наш канал Flutter.Много вырос на 50%;
⚙️ Поучаствовали в 10 масштабных мероприятиях;
⚙️ Завоевали 2 и 3 место на премии CrossConf Awards и серебро и бронзу на Tagline Awards в номинации «Лучшее мобильное MVP-приложение» с кейсом разработки мобильного приложения для сети «Аптека Ваша №1» и в номинации «Лучший маркетплейс» с кейсом создания первого маркетплейса горного оборудования в России;
⚙️ Запустили новые площадки для разработки;
⚙️ Оптимизировали процессы;
⚙️ Улучшили продуктовый подход и расширили спектр услуг;
⚙️ Научились делать больше с меньшими затратами ресурсов, стали эффективнее и сильнее.

С каждым годом количество крупных клиентов и сложных интересных проектов увеличивается, а значит — нам доверяют.

Спасибо всей команде, клиентам и партнёрам — без вас этот путь был бы невозможен! А мы замотивированы расти и не останавливаться, поэтому stay tuned❤️
Please open Telegram to view this post
VIEW IN TELEGRAM
🎉17👍74🔥3🤝1
Hola, Amigos! В день всех влюбленных подготовили для вас карточки с поздравлениями💖

Отправляйте близким, сохраняйте и пишите в комментариях, как ещё можно признаться в любви, если работаешь в IT:)
Please open Telegram to view this post
VIEW IN TELEGRAM
13🥰6💘3👍1👎1