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

Новости Flutter-разработки, дайджесты мероприятий, личный опыт.
Download Telegram
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
Hola, Amigos! Напоминаем о must-visit этого февраля — FlutterConf, первую в России конференцию, полностью посвященную Flutter!

В этот раз Павел Гершевич, наш Flutter Team Lead, выступит с докладом: «Многомодульность в Flutter 2.0. Все подходы и что нового». Павел поделится своим опытом, расскажет о современных подходах к многомодульности и том, как это может упростить вашу разработку.

📅 Дата: 21 февраля 2025 года
📍 Место: Москва, 3-я ул. Ямского Поля, 26А

Еще в программе:

Два потока докладов про реальные кейсы с нестандартными требованиями, архитектурные решения и инструменты для Flutter-проектов.
Нетворкинг-события — завести полезные знакомства и найти новых единомышленников.
Экспертная зона — обсудить конкретные вопросы с профессионалами, получить практический совет и понять, как расти в профессии.
Круглый стол: прошлое, настоящее и будущее Flutter.
• AfterParty, где получится неформально пообщаться с коллегами.

🔥 Напоминаем, промокод Amiga10 даст вам скидку 10% на билеты. Успейте зарегистрироваться!

Программа лежит по ссылке, а мы ждем вас в 1 зале в 11:30!
🔥53👍3
Hola, Amigos! На связи Михаил Чернецов, Flutter dev в Amiga. Сегодня рассмотрим плагин sensors_plus, который открывает доступ к сенсорам вашего устройства. С его помощью можно получать данные от акселерометра, гироскопа, магнитометра и барометра.

Как это работает?

Для доступа к данным сенсоров достаточно подписаться на соответствующий стрим. Например:

userAccelerometerEvents.listen(
(AccelerometerEvent event) {

},
onError: (error) {},
cancelOnError: true,
);


Важно: На некоторых старых Android-устройствах данные сенсоров могут быть недоступны. Поэтому не забывайте обрабатывать ошибки через onError.

Какие стримы доступны?

accelerometerEvents — необработанные данные акселерометра, включая гравитационное притяжение Земли.

userAccelerometerEvents — данные акселерометра без учета гравитации.

gyroscopeEvents — данные о вращении устройства.

magnetometerEvents — данные о магнитном поле вокруг устройства.

barometerEvents — данные об атмосферном давлении.

Для доступа к сенсорам в iOS необходимо добавить ключ в Info.plist, иначе приложение упадет.

<key>NSMotionUsageDescription</key>
<string>Ваше описание</string>


Для чего могут быть использованы эти датчики:

Акселерометр — например, для определения тряски устройства.

Магнитометр — для определения направления взгляда пользователя (например, в картографии).

Гироскоп — для определения наклона устройства (раньше часто использовался в играх).

Барометр — для измерения высоты над уровнем моря.

Плагин sensors_plus — это мощный инструмент для работы с сенсорами, который может открыть новые возможности для вашего приложения. Попробуйте и делитесь своими кейсами!
🔥9👍53
Дайджест февраля

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

⚪️ Cookies во Flutter. Часть 1
⚪️ Cookies во Flutter. Часть 2
⚪️ Многомодульность во Flutter 2.0
⚪️ С днем всех влюбленных
⚪️ Sensors_plus

Всем хорошего кода!
Please open Telegram to view this post
VIEW IN TELEGRAM
👍64🔥3
Hola, Amigos! FlutterConf 2025 позади, и это было мощно! 🚀

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

Наш Flutter TeamLead Павел Гершевич рассказал о многомодульности в Flutter 2.0 — разобрали подходы, обсудили лучшие практики и свежие фичи.

Также Павел поделился впечатлениями:

FlutterConf стал местом, где все Flutter-разработчики России могут общаться, обмениваться опытом и узнавать что-то новое.

Как член программного комитета скажу, что нам удалось собрать сильные доклады, и конференция прошла просто отлично! Много участников, общения, знакомств. Будем рады видеть на следующем FlutterConf.


Спасибо организаторам, спикерам и всем, кто присоединился! Увидимся в следующем году! 🚀
🔥85👍3
Hola, Amigos! Делимся полезным:

Критическое мышление в эпоху быстрого принятия решений

Руководитель в IT каждый день решает задачи разной степени адовости. Иногда решения принимаются на автомате, по шаблону — потому что так быстрее. Но чем выше ставка, тем важнее уметь включать критическое мышление.

28 марта на офлайн-митапе разберемся, как руководителям в IT не попадать в когнитивные ловушки и принимать решения осознанно. Организаторы из AGIMA обещают много экспертов и классную программу:

🔥 В первой части вечера бизнес-тренер Алексей Кельин научит сомневаться во всем — в хорошем смысле. Он покажет инструменты, которые помогут руководителям критически оценивать свои мысли, видеть ситуацию со всех сторон и принимать эффективные решения.

💬 Потом гости обсудят кейсы с лидерами команд из СберАналитики, Госуслуг, Okko, Магнит OMNI, СОГАЗ и AGIMA — когда нестандартные решения дали бизнесу профит в деньгах, людях и нервах.

🥂 В финале — зона для нетворкинга с вкусной едой, напитками и кальянами (потому что критическое мышление лучше тренируется с бокалом в руках).

Событие закрытое и эксклюзивное — только для руководителей IT-команд, CEO, CTO, CPO, PO, которые принимают стратегические решения в крупных компаниях.

Мы создаем атмосферу для обмена опытом между лидерами рынка, поэтому все заявки тщательно модерируются.

Количество мест ограничено — успейте зарегистрироваться по ссылке: https://clck.ru/3GqLWF
🔥53👍3
Hola, Amigos! На связи Павел Гершевич, Mobile Team Lead в Amiga. Сегодня обсудим максимально полезный инструмент для командной работы — Git Hooks.

При совместной разработке кода часто возникают различия в стилях: кто-то забывает переносы строк, кто-то — запятые. Конечно, можно поручить форматирование CI/CD, но это займет больше времени. Git Hooks выполняются на рабочей станции разработчика и легко настраиваются.

Для чего могут быть полезны Git Hooks:

⚙️ Форматирование кода — dart format
⚙️ Статический анализ кода — dart analyze
⚙️ Запуск тестов

Все это можно запускать в определенные моменты:

⚙️ Перед и после git commit
⚙️ Перед и после git push
⚙️ Перед и после других команд гита

Давайте рассмотрим на примере добавления команды на форматирование кода перед тем, как разработчик сделает коммит.

Пример: добавим команду форматирования кода перед коммитом. Сначала укажем папку для Git Hooks:

git config core.hooksPath .githooks/


Далее создадим эту папку и в ней файл pre-commit. Посмотрим на его наполнение:

#!/usr/bin/env bash

#dart format
printf "\e[33;1m%s\e[0m\n" 'Running dart format'

result=$(dart format .)
result_lines=$(echo "$result" | wc -l)

if [ "$result_lines" -gt 1 ]; then
echo "$result"
printf "\e[31;1m%s\e[0m\n" 'Dart format applied changes, please recommit'
exit 1
fi

echo "$result"
printf "\e[32;1m%s\e[0m\n" 'Finished running dart format'


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

Во второй части мы перенесем этот скрипт на Dart.

Делитесь в чате: используете ли вы Git Hooks в своих проектах? Какие команды запускаете?
Please open Telegram to view this post
VIEW IN TELEGRAM
👍63🔥3