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

Новости Flutter-разработки, дайджесты мероприятий, личный опыт.
Download Telegram
Hola, Amigos! Наконец можем поделиться с вами записью доклада Паши Гершевича, нашего Flutter Team Lead, с конференции CrossConf о кроссплатформенной разработке и трендам IT, которая прошла 8 ноября в Москве🔥

Напомним, тема доклада: «UI логгера на Flutter: Как сделать работу с логами удобнее и быстрее?».

В своем выступлении он рассказал о Dev Screen, зачем он нужен и как его внедрять, а также о том, как эффективно с ним работать при релизе приложения. Доклад особенно полезен Flutter-разработчикам 🙂

Запись выступления ждет вас по ссылке. Ставьте реакции, если понравился доклад Паши, и делитесь в чате, какая тема выступления вас бы точно заинтересовала!
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥85👍5
Hola, Amigos! Наконец готовы анонсировать крупнейшую конференцию BOOST'25 для владельцев и руководителей веб-студий, digital-агентств и продакшенов.

Мероприятие пройдет 23-24 сентября на площадке Школы управления Сколково⚙️

Приходите послушать топовых экспертов, предпринимателей и визионеров из различных областей и компаний ⚙️

*️⃣ 1 200 участников
*️⃣ 150+ спикеров

В этом году на BOOST 7 тематических потоков:

☁️Управление бизнесом
☁️Продажи, маркетинг и PR
☁️Дизайн и креатив
☁️Управление проектами ( новый поток)
☁️Digital-маркетинг
☁️Управление разработкой
☁️Управление и тренды в интернет-маркетинге

Что вас ждёт на конференции помимо насыщенной докладной части:

🍎Мастермайнды и мастер-классы с лидерами отрасли:
вы сможете получить ценные знания и навыки, которые помогут вашему агентству выйти на новый уровень.

🍎 Выставка продуктов и решений: ознакомьтесь с новейшими инструментами и технологиями, которые помогут оптимизировать процессы в вашем бизнесе.

А ещё:

🥝Нетворкинг: возможность встретиться с коллегами, обменяться идеями и наладить полезные контакты с профессионалами из разных регионов.

🥝Секретные бары и афтепати до последнего гостя.

📌 Билеты доступны в трех категориях и их количество ограничено, регистрация на BOOST'25 по ссылке.

P.S. Дарим промокод на скидку 10% — amiga10
Please open Telegram to view this post
VIEW IN TELEGRAM
2
Hola, Amigos! Уже в воскресенье встретимся на крупнейшем IT-забеге страны — RUNIT. В этом году будет 12 000 участников и более 5 000 бегунов. Если не участвуете в забеге, все равно приходите на мероприятие, там будем мы!

На нашей площадке в этом году:

⚙️ команда — будем ждать вас, чтобы обсудить идею для стартапа или спеть «Верхом на звезде» до начала концерта;
⚙️ тент и пуфики — перевести дух в тени и расслабиться;
⚙️ кольцеброс — прошлогодняя звезда! Всем так понравилось играть, что мы решили повторить и в этом году. Победителей ждут вкусные подарки и фирменные носки от наших партнеров Babushkasocks.

Приходите, побеждайте и забирайте крутые призы! ❤️
Please open Telegram to view this post
VIEW IN TELEGRAM
2🔥2😍2
Hola, amigos!

Ждем всех на RUNIT!

У нас много подарков и веселые активности

Приходите на стенд Amiga
🔥6
Hola, Amigos! Сегодня расскажем, как сэкономить время при работе в VSCode.

Добавьте в settings.json:


{
"editor.formatOnSave": true,
"[dart]": {
"editor.formatOnSave": false,
"editor.inlayHints.enabled": "off",
"editor.codeActionsOnSave": {
"source.fixAll": "explicit",
"source.organizeImports": "explicit",
}
}
}


⚙️ editor.formatOnSave: автоматически форматирует Dart-файлы;

⚙️ "[dart]": { "editor.formatOnSave": false }: отключает или включает дефолтный Dart Formatter при сохранении файла;

⚙️ editor.inlayHints.enabled: "off": отключает подсказки типов (inlay hints);

⚙️ source.fixAll: автоматически фиксит мелкие ошибки (добавляет const, корректирует код);

⚙️ source.organizeImports: упорядочивает и удаляет неиспользуемые импорты;

Эти настройки помогают поддерживать чистый, организованный, готовый к продакшну код без лишней рутины.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥16👍52
Hola, Amigos! Спасибо всем, кто забежал на нашу площадку на крупнейшем IT-забеге страны RUNIT'25. Нас буквально не отпускали — со всеми поболтали, тысячу раз сыграли в кольцеброс, обменялись идеями и зарядились энергией на год вперед!

⚙️Кольцеброс снова стал звездой, а брендированные подарки — шары от МосШар и носки от наших друзей из Babushkasocks быстро разлетелись между крутыми участниками.

Спасибо всем, кто был с нами в этом году, а остальных ждем в следующем — мы готовим кое-что очень классное ❤️
Please open Telegram to view this post
VIEW IN TELEGRAM
6🔥4
Как экспортировать Canvas в изображение без рендера на экране

Иногда нужно сохранить нарисованное в CustomPainter в виде PNG, но не хочется (или невозможно) отображать его на экране. Можно это сделать, используя Canvas и PictureRecorder:

Future<Uint8List> toImage(BuildContext context, Size size) async {
final devicePixelRatio = MediaQuery.of(context).devicePixelRatio;
final recorder = ui.PictureRecorder();
final canvas = Canvas(recorder);

// Масштабируем канвас под плотность пикселей
canvas.scale(devicePixelRatio);

final painter = MyPainter(); // <-- ваш кастомный painter
painter.paint(canvas, size);

// Считаем итоговый размер
final width = (size.width * devicePixelRatio).floor();
final height = (size.height * devicePixelRatio).floor();

// Получаем изображение
final imageResult = await recorder
.endRecording()
.toImage(width, height);

// Конвертируем в PNG
final byteData = await imageResult.toByteData(
format: ui.ImageByteFormat.png,
);

return byteData!.buffer.asUint8List();
}
👍17🤬21
Как создавать качественные интерфейсы, где все отступы и размеры кратные 8 px

Что это даст? По сути, «8» — это простая и эффективная система: все элементы дизайна (ширина, высота, внутренние/внешние отступы) кратны 8 px. Такой подход упрощает верстку, делает интерфейс визуально гармоничным и облегчает работу команды.

class AppSpacer extends StatelessWidget {
final double? width;
final double? height;

const AppSpacer._({Key? key, this.width, this.height}) : super(key: key);

factory AppSpacer.p32() => const AppSpacer._(height: 32, width: 32);
factory AppSpacer.p24() => const AppSpacer._(height: 24, width: 24);
factory AppSpacer.p16() => const AppSpacer._(height: 16, width: 16);
factory AppSpacer.p8() => const AppSpacer._(height: 8, width: 8);

@override
Widget build(BuildContext context) {
return SizedBox(width: width, height: height);
}
}


С помощью AppSpacer.pX() вы задаете отступы и размеры строго по системе 8: 8, 16, 24, 32. Делитесь в чате, пробовали такой метод?
👍64🤔4🤡3🔥1
Hola, Amigos! Сегодня расскажем, как открыть системные настройки, если пользователь отказался от уведомлений (особенно на iOS)

Если пользователь отключил уведомления на iOS, повторно показать системный prompt уже нельзя. Единственный вариант — перенаправить его в настройки приложения вручную.

Вариант 1 — через url_launcher

import 'package:url_launcher/url_launcher.dart';

Future<void> openSettings() async {
Uri url;
if (defaultTargetPlatform == TargetPlatform.iOS) {
url = Uri.parse('app-settings:');
} else if (defaultTargetPlatform == TargetPlatform.android) {
url = Uri.parse('package:uly.vlog.diary');
} else {
throw Exception('Unsupported platform');
}

if (await canLaunchUrl(url)) {
await launchUrl(url);
} else {
throw 'Could not launch $url';
}
}


Вариант проще — с permission_handler:

import 'package:permission_handler/permission_handler.dart';

openAppSettings();


Делитесь в чате, использовали эти методы?
🔥52👍1
Hola, Amigos! На связи Павел Гершевич, Mobile Team Lead в Amiga. Сегодня разберемся, как нам установить релизное приложение на iOS 🙂

Для начала нам нужен файл с разрешением `.app` или .ipa — для этого собираем iOS привычным способом. Тут все зависит от вас — flutter build ios --release или flutter build ipa, а может даже архивирование через Xcode. Для IPA делать нам уже ничего не надо, а вот для других способов нам нужно достать файл:

Для сборки через консоль нужно пойти по пути /build/ios/archive/Runner.xcarchive, там нажать правой кнопкой мыши и в меню выбрать “Показать содержимое пакета”, файл будет по пути /Products/Applications/Runner.app.

Для сборки через Xcode из Organizer нажимаем правой кнопкой мыши на архив, выбираем “Show in Finder”, а дальше, как и с архивом из консоли, пока не дойдем до Runner.app.

Вся остальная работа проста. Нужно открыть Xcode, пойти по пути Windows -> Devices and Simulators -> Ваше устройство. Там будет графа Installed Apps, куда мы и добавим файл — можно либо перетащить его, либо нажать на плюсик и выбрать из системы. После этого нужно немного подождать завершения установки.

Обращаю внимание, что устройство должно быть зарегистрировано в App Store Connect на аккаунт, которому принадлежит приложение.

Пишите в чате, использовали такой метод?
Please open Telegram to view this post
VIEW IN TELEGRAM
3👍3🔥2