Flutter Pulse
523 subscribers
335 photos
731 links
На канале будут новости про flutter с сайтов, информация об обновлении пакетов, а также авторский контент.
Download Telegram
🔥 Почему твой Flutter UI лагает и как это пофиксить? Часть 1. Смотри разбор!

Привет, Flutter-энтузиасты! Только что наткнулся на суперполезное видео, которое раз и навсегда закрывает больную тему — лаги интерфейса. Если твой UI тормозит, а FPS прыгает — это must-watch! 🚀

👉 СМОТРЕТЬ ВИДЕО

Автор (Руслан) наглядно разбирает:
🔹 Как искать узкие места через Flutter DevTools (вкладка Performance)
🔹 Почему виджеты-«монстры» убивают FPS и как их декомпозировать
🔹 Магию const — как одна правка ускоряет рендеринг в разы!
🔹 Реальные примеры: от 37 мс лагов до плавного UI

💡 Особенно полезно, если ты:
- Не понимаешь, почему интерфейс фризит
- Хочешь научиться делать замеры производительности
- Не веришь, что const — не просто «совет» 😉

📌 Это часть цикла про архитектуру Flutter! Завтра, кстати, вторая часть

💬 Поддержи канал:
👍 Лайк — если полезно!

#Flutter #Dart #FlutterPulse #FlutterPulseTips #FlutterPulseYoutube #Refactoring #CleanCode #FlutterArchitecture #StatefulWidget #ComponentBasedUI #fluttertutorial

P.S. Больше лайфхаков — по хэштегу #FlutterPulseYoutube! Подписывайся на @flutterpulse, если хочешь глубже разбирать Flutter 🔥
Извлечение границ из изображения
Привет, Flutter-разработчики! 👋 Сегодня мы поделимся с вами интересным способом обработки изображений с использованием пакета Image в Dart. 📸

Используем пакет Image для извлечения границ
Пакет Image в Dart предоставляет мощные инструменты для обработки изображений. Одним из интересных применений этого пакета является извлечение границ из изображений. 🔍

Как это работает?
1. Применяем ядро Лапласа ко всем пикселям изображения с помощью функции свёртки (convolution function).
2. Ядро Лапласа помогает выделить границы на изображении, применяя определённую матрицу фильтра к каждому пикселю.

Пример кода:

import 'package:image/image.dart' as img;

// Декодируем изображение из данных
var photo = img.decodeImage(data.buffer.asUint8List());

// Определяем фильтр (ядро Лапласа)
var filter = [
0, -1, 0,
-1, 4, -1,
0, -1, 0,
];

// Применяем свёртку к изображению с использованием фильтра
photo = img.convolution(photo, filter, div: div, offset: offset);


Этот код демонстрирует, как можно использовать функцию convolution из пакета Image для применения ядра Лапласа и выделения границ на изображении. 🔮

Оцените новую рубрику и напишите в комментариях, насколько она вам полезна! 💬

Все подобные новости можно найти по хэштегу #FlutterPulseTips

#flutter #dart #flutterpulse #FlutterPulseTips #MobileDevelopment #ImageProcessing #CodingTips
🚨 Почему твой Flutter UI лагает и как это пофиксить? Часть 2. Глубокий разбор!

Привет, Flutter-разработчики! Руслан подготовил 🔥 огненное видео, которое раз и навсегда прольет свет на причины лагов в интерфейсе. Не просто теория — практические кейсы и инструменты!

В этом выпуске ты узнаешь:
🔹 Как простая функция может полностью заблокировать UI
🔹 Что на самом деле происходит в Raster thread
🔹 Почему выбор движка рендеринга (Skia vs Impeller) критичен для плавности
🔹 Магию RepaintBoundary и как она спасает производительность

🛠 Практика:
- Детальный разбор вкладки Performance в Flutter DevTools
- Как находить лаги, делать замеры и отлаживать UI
- Реальные примеры оптимизации «тяжелых» виджетов

👉 Смотрите видео здесь:
Почему твой Flutter UI лагает и как это пофиксить

#Flutter #Dart #FlutterPulse #FlutterPulseTips #FlutterPulseYoutube
P.S. Ищете больше практики? Смотрите все видео цикла по хэштегу → #FlutterPulseYoutube! 💻
Шпаргалка по Android adb

Полезные команды для управления вашим Android-устройством через командную строку 🤖💻

Вход в оболочку телефона

adb shell # вход в оболочку телефона
# Android основан на unix, поэтому вы можете перемещаться
# и выполнять команды как в обычной unix-системе


Установка и удаление APK

adb install myApp.apk # установить apk
adb install -r myApp.apk # обновить приложение без удаления его данных
adb uninstall myApp.apk # удалить приложение


Захват изображения и видео

adb shell screencap -p /sdcard/image.png # захватить изображение
adb shell screenrecord -p /sdcard/video.mp4 # захватить видео
adb -d pull /sdcard/image.png . # извлечь изображение или видео из папки sdcard


Отображение касаний на устройстве

adb shell content insert \
--uri content://settings/system \
--bind name:s:show_touches \
--bind value:i:1 # включить отображение касаний на устройстве

adb shell content insert \
--uri content://settings/system \
--bind name:s:show_touches \
--bind value:i:0 # отключить отображение касаний на устройстве


Оцените нашу новую рубрику лайком 👍 и подпишитесь, чтобы быть в курсе всех последних советов и новостей! 😊

Все подобные новости вы можете найти по хэштегу #FlutterPulseTips

#flutter #dart #flutterpulse #FlutterPulseTips #AndroidDev #MobileDev #DevTips #FlutterTips
👍2
🚀 ИИ в разработке: Будущее уже здесь! Смотрите лекцию ШМР 2025

Привет, Flutter-сообщество! Только что наткнулся на 🔥горячее видео, которое переворачивает представление о работе разработчика. Если ты еще не используешь AI-инструменты в повседневных задачах — этот материал станет твоим прорывом!

В лекции "Применение AI-инструментов в разработке — ШМР 2025" Сергей Кольцов (Яндекс) на реальных примерах показывает:

🧠 Как нейросети уже сегодня:
• Автоматизируют рутину (тесты, рефакторинг, документацию)
• Ускоряют поиск решений в 3-5 раз
• Помогают осваивать новые технологии

💡 Ключевые инсайты из видео:
▫️ Почему 63% разработчиков уже используют ИИ в работе
▫️ Как избежать "техдолговой ямы" при работе с AI
▫️ VSCode + Copilot vs Cursor vs Terminal Agents — что выбрать?
▫️ Реальный кейс: миграция проекта на Flutter с помощью ИИ за 10 минут ⏱️

💬 Цитата, заставляющая задуматься:
"Мы прошли горизонт событий. Взлёт начался" — Сэм Альтман (OpenAI)

👉 Смотрите полную версию с демо-примерами и прогнозами:
YouTube или VkVideo

Не забудьте подписаться на канал! Каждый день — новые фишки Flutter, разборы кейсов и лайфхаки. 🔔

👉 Все видео по теме в канале: ищите по хэштегу #FlutterPulseYoutube

#Flutter #Dart #FlutterPulse #FlutterPulseTips #FlutterPulseYoutube
👍1
Измерение производительности функции в тесте

Привет, Flutter-разработчики! 👋 Сегодня мы поделимся с вами полезным советом о том, как измерить производительность функции внутри теста. 🔍

Зачем это нужно?
- Оптимизация производительности вашего приложения 🔝
- Выявление узких мест в коде 🔎
- Улучшение пользовательского опыта 👥

Пример кода:


testWidgets('проверка производительности большой функции', (
WidgetTester tester,
) async {
// Запускаем секундомер
final sw = Stopwatch()..start();
await tester.tap(find.byKey(const ValueKey('btn')));
await tester.pumpAndSettle(const Duration(milliseconds: 100));
// Проверяем, что прошедшее время меньше 500 мс
expect(sw.elapsedMilliseconds, lessThan(500));
});



Что здесь происходит? 🤔
1. Мы запускаем тест виджета с помощью `testWidgets`.
2. Запускаем секундомер (`Stopwatch`) перед выполнением тестируемой функции.
3. Выполняем необходимые действия (в данном случае тап по кнопке с ключом 'btn').
4. Проверяем, что общее время выполнения не превышает заданный порог (500 мс).

👍 Оцените эту рубрику и напишите в комментариях, какие темы вас интересуют! 💬

Все подобные новости можно найти по хэштегу #FlutterPulseTips

#flutter #dart #flutterpulse #FlutterPulseTips #FlutterTips #MobileDev #PerformanceOptimization #TestingInFlutter
1
🔥 Почему твоя Lottie-анимация во Flutter лагает и как это пофиксить?

Привет, Flutter-энтузиасты! 😊 Столкнулись с тормозящими анимациями, которые портят UX? Наш друг Руслан Цицер приготовил для вас супер-полезный гайд, где разбирает эту боль на реальном примере!

▶️ В этом выпуске вы увидите:
• Создание простого TODO-листа с нуля 🗒
🔍 Анализ Raster thread при добавлении Lottie-анимации
🛠 Пошаговый разбор оптимизации через Flutter DevTools
• Как находить лаги, делать замеры и отладку UI

💡 Главные фишки:
- Работа с вкладкой Performance в DevTools
- Оптимизация через RenderCacheMode.raster
- Практические лайфхаки для плавности анимаций
- Разбор кода векторной анимации "помидорки" 🍅


👇 Не пропустите детали! Смотрите видео, чтобы ваши анимации летали:
СМОТРЕТЬ ВИДЕО

💬 Пишите в комментариях: С какими сложностями в анимациях сталкивались вы?

👍 Поддержите автора:
• Ставьте лайк, если полезно!

#Flutter #Dart #FlutterPulse #FlutterPulseTips #FlutterPulseYoutube #Refactoring #CleanCode #FlutterArchitecture #StatefulWidget #ComponentBasedUI #fluttertutorial
👉 Ещё видео по тегу: #FlutterPulseYoutube
Смена версии Flutter

Иногда это просто необходимо 🤔

Чтобы изменить версию Flutter, следуйте этим шагам:

1. Проверьте, где установлен Flutter на вашей системе, а затем выполните команду:


git checkout 1.22.6
# Обновление файлов: 100% (4559/4559), готово.
# Примечание: переключение на '1.22.6'.



Теперь следующая команда flutter установит все необходимые требования 📦

2. Чтобы вернуться к последней стабильной версии, просто используйте:


git checkout stable



ИЛИ

Используйте FVM, чтобы переключать версию Flutter напрямую 🔄



dart pub global activate fvm



Или используйте пакет brew... 🍺


fvm use 1.22.6



Больше информации на https://fvm.app/ 🤓

Оцените нашу новую рубрику! 👍👎
Все подобные новости можно найти по хэштегу #FlutterPulseTips

#flutter #dart #flutterpulse #FlutterPulseTips #FVM #FlutterTips #MobileDev #DevTips
🚀 Flutter Deep Linking & State Restoration: Как вернуть пользователя ТОЧНО туда, где он остановился?

Привет, Flutter-энтузиасты! Сегодня делимся 🔥горячим видео от коллег, которое перевернет ваше представление о навигации и сохранении состояния в приложениях! Речь о вебинаре «Flutter Deep Linking & State Restoration: возвращаем пользователей» из курса «Flutter Mobile Developer».

Представьте: пользователь ушел из вашего приложения (SMS, звонок, перезапуск системы), а при возвращении видит точно тот экран, поле формы или даже позицию скрола, где остановился! 💯 Магия? Нет — грамотная работа с диплинками и восстановлением состояния.

Что разобрали в видео:
- Диплинки: Scheme-based, Universal Links, App Links — чем отличаются и как внедрить.
- Навигация: Когда выбрать Navigator 1.0, а когда перейти на мощный Router API (Navigator 2.0) для сложных сценариев.
- State Restoration: Как сохранять/восстанавливать состояние UI даже после выгрузки приложения из памяти.
- Restorable Routes: Автоматический возврат пользователя в нужную точку стека навигации.
- Практика: Создание приложения с «бесшовным» UX — диплинки + восстановление состояния.

🎯 После просмотра вы сможете:
- Реализовать «умные» диплинки, которые открывают нужный экран.
- Выбирать оптимальный подход к навигации для вашего проекта.
- Избавить пользователей от потери данных в формах 🗒 или позиции в ленте.
- Сделать приложение, которое никогда не сбрасывает прогресс!

Кому будет полезно?
- Разработчикам multi-screen приложений.
- Тем, кто хочет повысить retention и UX.
- Всем, кто боролся с «сбросом» состояния после перезапуска.

💡 Главный секрет: Flutter — это не только про красивый UI, но и про контроль над каждым шагом пользователя. Видео покажет, как превратить технические возможности в конкурентное преимущество!

👉 Смотрите запись прямо сейчас:
Flutter Deep Linking & State Restoration: возвращаем пользователей

Не забудьте подписаться на канал Flutter Pulse — здесь только полезное для вашего кода! Ищите другие уроки по хэштегу #FlutterPulseYoutube 🚀

#Flutter #Dart #FlutterPulse #FlutterPulseTips #FlutterPulseYoutube #DeepLinking #StateRestoration #MobileDev #UX
Создаем защиту маршрута страницы

Привет, подписчики! 👋 Сегодня мы рассмотрим полезный совет по Flutter - создание защиты маршрута страницы. 🚀

Что это такое?

Защита маршрута страницы позволяет перенаправлять пользователя на другую страницу, если определенное условие не выполнено. 🔄

Пример реализации



Route<dynamic> route(RouteSettings settings) {
switch (settings.name) {
case 'init_account':
return MaterialPageRoute(
builder: (_) => AuthenticatedGuard(child: InitAccountPage()),
);
}
}

// AuthenticatedGuard внедряет нашу защиту, чтобы предотвратить доступ неавторизованного пользователя к нашей странице

class Guard extends StatelessWidget {
final Future<bool> canActivate;
final Widget child;
final String fallbackRoute;

const Guard({
Key? key,
required this.canActivate,
required this.child,
required this.fallbackRoute,
}) : super(key: key);

@override
Widget build(BuildContext context) {
return FutureBuilder<bool>(
future: canActivate,
builder: (_, isOk) {
if (!isOk.hasData || isOk.hasError) {
return Container();
}
if (isOk.data!) {
return child; // Показываем страницу, если условие выполнено
}
redirect(context); // Иначе перенаправляем
return Container();
},
);
}

redirect(BuildContext context) {
WidgetsBinding.instance!.addPostFrameCallback((timeStamp) {
Navigator.pushReplacementNamed(context, fallbackRoute);
});
}
}



Совет для нескольких условий: вы можете каскадировать защиты или просто объединить ваши условия. 🤔

Оцените нашу новую рубрику и напишите в комментариях, что вы думаете! 💬

Все подобные новости можно найти по хэштегу #FlutterPulseTips 👍

#flutter #dart #flutterpulse #FlutterPulseTips #MobileDevelopment #FlutterTips #Programming #Development #Coding #FlutterCommunity
Flutter Pulse
🔥 ВИДЕО ДНЯ: Flutter TDD Чистая Архитектура [1] - Объяснение и структура проекта Привет, Flutter-энтузиасты! 👋 Сегодня делимся 🔥горячим видео, которое перевернет ваш подход к разработке! Денис (@DenUP) детально разбирает Clean Architecture + TDD — связку…
🚀 Flutter TDD Чистая Архитектура: Entity и Use Cases — Глубокое Погружение!

Привет, коллеги! Только что наткнулся на 🔥горячее видео, которое перевернет ваш подход к разработке на Flutter. Если вы хотите создавать чистый, тестируемый и масштабируемый код — это must-watch!
Это вторая часть видео, первая уже была опубликована в нашем канале.

👉 Смотреть видео: Flutter TDD Чистая Архитектура [2] - Entity и Use Cases

Что внутри?
🔹 Entity — учимся проектировать ядро приложения, независимое от фреймворков.
🔹 Use Cases — превращаем бизнес-логику в изолированные сценарии.
🔹 TDD в действии — пишем тесты ДО кода, гарантируя надежность.
🔹 Разбор пакетов: equatable, dartz, мокирование с mockito.
🔹 Обработка ошибок через Functional Programming!

Таймкоды для навигации:

04:34 → Entities (сущности)
10:17 → Создание Domain/Repository
15:18 → UseCases
17:56 → TDD на практике (пишем тест!)
30:18 → Red/Green тестирование


💡 Автор детально объясняет, как:
- Отделить логику от реализации (даже HTTP-запросов!).
- Использовать Either для обработки ошибок.
- Тестировать Use Cases с мокированием зависимостей.

👉 Зачем смотреть?
Если вы устали от "спагетти-кода", это видео — ваш спасение! Автор на реальном примере показывает, как архитектура делает код предсказуемым, а тесты — естественной частью разработки.

💬 P.S. Больше уроков по Flutter по хэштегу #FlutterPulseYoutube! Подписывайтесь, чтобы не пропустить разборы → @FlutterPulse

#Flutter #Dart #FlutterPulse #FlutterPulseTips #FlutterPulseYoutube
👎1
Полезный совет по Dart: Как изменить версию Flutter

Привет, разработчики! 👋 Сегодня мы поделимся с вами полезным советом о том, как легко переключаться между версиями Flutter. 💡

Иногда возникает необходимость изменить версию Flutter. Вот как это можно сделать:

1. Проверьте, где установлен Flutter на вашей системе, а затем выполните команду:
git checkout 1.22.6
> Updating files: 100% (4559/4559), done.
> Note: switching to '1.22.6'.

После этого следующая команда flutter установит все необходимые требования.

2. Чтобы вернуться к последней стабильной версии, просто используйте:
git checkout stable

Или используйте FVM для быстрого переключения версий Flutter:

1. Активируйте FVM:
dart pub global activate fvm

2. Используйте нужную версию:
fvm use 1.22.6

Дополнительная информация доступна на сайте FVM:
https://fvm.app/docs/getting_started/installation
https://fvm.app/

Оцените нашу новую рубрику и напишите в комментариях, какие темы вас интересуют! 🤔💬

Все подобные советы ищите по хэштегу #FlutterPulseTips
#flutter #dart #flutterpulse #FlutterPulseTips #FlutterTips #MobileDev #DevTips #FlutterCommunity
Создаем защиту маршрута страницы

Привет, подписчики! 👋 Сегодня мы рассмотрим полезный совет по Flutter - создание защиты маршрута страницы. 🚀

Что это такое?

Защита маршрута страницы позволяет перенаправлять пользователя на другую страницу, если определенное условие не выполнено. 🔄

Пример реализации



Route<dynamic> route(RouteSettings settings) {
switch (settings.name) {
case 'init_account':
return MaterialPageRoute(
builder: (_) => AuthenticatedGuard(child: InitAccountPage()),
);
}
}

// AuthenticatedGuard внедряет нашу защиту, чтобы предотвратить доступ неавторизованного пользователя к нашей странице

class Guard extends StatelessWidget {
final Future<bool> canActivate;
final Widget child;
final String fallbackRoute;

const Guard({
Key? key,
required this.canActivate,
required this.child,
required this.fallbackRoute,
}) : super(key: key);

@override
Widget build(BuildContext context) {
return FutureBuilder<bool>(
future: canActivate,
builder: (_, isOk) {
if (!isOk.hasData || isOk.hasError) {
return Container();
}
if (isOk.data!) {
return child; // Показываем страницу, если условие выполнено
}
redirect(context); // Иначе перенаправляем
return Container();
},
);
}

redirect(BuildContext context) {
WidgetsBinding.instance!.addPostFrameCallback((timeStamp) {
Navigator.pushReplacementNamed(context, fallbackRoute);
});
}
}



Совет для нескольких условий: вы можете каскадировать защиты или просто объединить ваши условия. 🤔

Оцените нашу новую рубрику и напишите в комментариях, что вы думаете! 💬

Все подобные новости можно найти по хэштегу #FlutterPulseTips 👍

#flutter #dart #flutterpulse #FlutterPulseTips #MobileDevelopment #FlutterTips #Programming #Development #Coding #FlutterCommunity
👍1
Полезный совет по Dart: Как изменить версию Flutter

Привет, разработчики! 👋 Сегодня мы поделимся с вами полезным советом о том, как легко переключаться между версиями Flutter. 💡

Иногда возникает необходимость изменить версию Flutter. Вот как это можно сделать:

1. Проверьте, где установлен Flutter на вашей системе, а затем выполните команду:
git checkout 1.22.6
> Updating files: 100% (4559/4559), done.
> Note: switching to '1.22.6'.

После этого следующая команда flutter установит все необходимые требования.

2. Чтобы вернуться к последней стабильной версии, просто используйте:
git checkout stable

Или используйте FVM для быстрого переключения версий Flutter:

1. Активируйте FVM:
dart pub global activate fvm

2. Используйте нужную версию:
fvm use 1.22.6

Дополнительная информация доступна на сайте FVM:
https://fvm.app/docs/getting_started/installation
https://fvm.app/

Оцените нашу новую рубрику и напишите в комментариях, какие темы вас интересуют! 🤔💬

Все подобные советы ищите по хэштегу #FlutterPulseTips
#flutter #dart #flutterpulse #FlutterPulseTips #FlutterTips #MobileDev #DevTips #FlutterCommunity
🔥 Узнай, как вынести управление анимацией за пределы Stateful Widget с InheritedWidget!

Привет, Flutter-энтузиасты! Нашёл для вас супер-полезное видео от Руслана Цицера, которое перевернёт ваше представление о работе с анимацией и стейт-менеджментом. Если вы хотите избавиться от "тормозов" в анимациях и научиться грамотно выносить логику — это must-watch! 🚀

В этом выпуске:
🎯 Продолжаем работу с TODO-листом — практика на реальном проекте!
🧠 Погружаемся в стейт-менеджмент — основы без сторонних библиотек.
🔄 Выносим управление Lottie-анимацией из Stateful Widget — избавляемся от тормозов.
⚡️ Используем InheritedWidget для передачи контроллера через контекст — элегантное решение!

Почему стоит посмотреть?
👉 Руслан наглядно показывает, как:
- Создать независимый виджет для анимации (TomatoAnimationWrapper)
- Передавать AnimationController через контекст
- Оптимизировать перерисовку с RepaintBoundary
- Избегать типичных ошибок при работе с InheritedWidget

Смотрите видео здесь:
Как пользоваться Inherited widget

👉 Обязательно подпишитесь на канал автора, если ещё не сделали этого! Его серия про архитектуру Flutter — настоящая золотая жила.

А у нас? Ловите новые лайфхаки и куча полезной инфы каждый день!
#Flutter #Dart #FlutterPulse #FlutterPulseTips #FlutterPulseYoutube
1
Определение платформы, на которой запущено приложение

Flutter потрясающий... работает на Android, iOS, Web, Windows, Linux, macOS.

При разработке кроссплатформенных приложений часто возникает необходимость определить, на какой платформе запущено приложение. Flutter предоставляет удобные инструменты для этого.

Пример кода:



import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';

class PlatformUtils {
static bool get isDesktop => defaultTargetPlatform == TargetPlatform.windows ||
defaultTargetPlatform == TargetPlatform.linux ||
defaultTargetPlatform == TargetPlatform.macOS;

static bool get isMobile => defaultTargetPlatform == TargetPlatform.android ||
defaultTargetPlatform == TargetPlatform.iOS;

static bool get isWeb => kIsWeb;
}




Важно: Не импортируйте dart:io, если планируете использовать приложение на web, так как dart:io недоступен на web. Вместо этого используйте flutter/foundation.

Оцените новую рубрику по Flutter советам 🤔💡! Ваши отзывы помогут нам сделать контент еще лучше 👍. Все подобные новости можно найти по хэштегу #FlutterPulseTips.

#flutter #dart #flutterpulse #FlutterPulseTips #MobileDevelopment #CrossPlatform #CodingTips #DevTips
👍3👌2🔥1
Запускайте тесты с несколькими вариантами

Привет, Flutter-разработчики! 👋 Сегодня мы поделимся с вами полезным советом о том, как запускать тесты с несколькими вариантами без необходимости писать отдельный тест для каждого значения. 📈

Вы когда-нибудь сталкивались с ситуацией, когда нужно протестировать один и тот же сценарий с разными входными данными? Вместо того, чтобы писать множество повторяющихся тестов, вы можете использовать возможности ValueVariant из Flutter! 🔥



final timesVariant = ValueVariant<double>({1, 10, 100, 1000}); // Создаём вариант со списком значений

testWidgets('push counter N times', (
WidgetTester tester,
) async {
await tester.pumpWidget(const myApp()); // Инициализируем виджет
for (int i = 0; i < timesVariant.currentValue!; i++) { // Получаем текущее значение варианта
await tester.tap(find.byType(OutlinedButton).first); // Симулируем нажатие кнопки
}
expect(find.text("pushed ${timesVariant.currentValue!} times"), findsOneWidget); // Проверяем текст
}, variant: timesVariant); // Устанавливаем вариант для теста




В этом примере мы:
1. Создаём ValueVariant с нужными нам значениями.
2. Используем timesVariant.currentValue внутри теста, чтобы получить текущее значение.
3. Указываем variant: timesVariant, чтобы тест выполнился для каждого значения.

Таким образом, вы экономите время и пишете более чистый код! 💪

Оцените новую рубрику и напишите в комментариях, насколько она вам полезна! 🤔

Все подобные новости можно найти по хэштегу #FlutterPulseTips

#flutter #dart #flutterpulse #FlutterPulseTips #FlutterTips #MobileDevelopment #Testing #ValueVariant #FlutterTesting #CodingTips
👍1
Форматирование JSON с помощью Dart

Привет, разработчики! 👋 Сегодня мы рассмотрим полезный совет по работе с JSON в Dart. Вы узнаете, как красиво напечатать JSON-строку, сделав её более читаемой и удобной для отладки 🛠️

Проблема: JSON-данные часто приходят в компактном, неформатированном виде, что затрудняет их чтение и анализ.

Решение: Используйте класс JsonEncoder из пакета dart:convert для форматирования JSON.


import 'dart:convert';

// Создаём кодировщик с отступами для форматирования
var encoder = const JsonEncoder.withIndent(' ');
// Преобразуем данные в красиво отформатированную строку
String prettyprint = encoder.convert(data);


Этот простой код позволяет превратить нечитаемую JSON-строку в структурированный и понятный формат с отступами 🌟

Оцените эту рубрику и напишите в комментариях, какие темы вам было бы интересно разобрать в следующих выпусках! 💬

Все подобные новости вы можете найти по хэштегу #FlutterPulseTips

#flutter #dart #flutterpulse #FlutterPulseTips #JSON #DartTips #FlutterTips #CodingTips #AppDevelopment #MobileDevelopment
👍31
Спам кнопок: как предотвратить множественные нажатия?

Вы когда-нибудь сталкивались с ситуацией, когда пользователь нажимает кнопку несколько раз подряд, вызывая нежелательные действия? 🤯

Представьте, что пользователь нажимает кнопку "Лайк" 10 раз за 1 секунду! 👍 Как сделать так, чтобы событие сработало только один раз? 🤔

Решение: использование RxDart с debounceTime ⏱️


import 'dart:async';
import 'package:flutter/material.dart';
import 'package:rxdart/subjects.dart';
import 'package:rxdart/rxdart.dart';

class LikeButtonWidget extends StatefulWidget {
final Function onTap;

const LikeButtonWidget({required this.onTap, Key? key}) : super(key: key);

@override
_LikeButtonWidgetState createState() => _LikeButtonWidgetState();
}

class _LikeButtonWidgetState extends State<LikeButtonWidget> {
final pushSubject = BehaviorSubject<void>();
late StreamSubscription<void> pushSubscription;

@override
void initState() {
super.initState();
pushSubscription = pushSubject.stream
.debounceTime(const Duration(milliseconds: 1000))
.listen((_) {
// отправить запрос на сервер или выполнить другое действие
widget.onTap();
});
}

@override
void dispose() {
super.dispose();
pushSubscription.cancel(); // не забудьте отменить подписку на поток
}

@override
Widget build(BuildContext context) {
return InkWell(
onTap: () {
pushSubject.add(null);
},
child: const Icon(Icons.plus_one),
);
}
}


Этот код создает кнопку "Лайк", которая срабатывает только один раз в секунду, даже если пользователь нажимает ее несколько раз подряд. 🔥

Оцените нашу новую рубрику и оставьте свои отзывы! 😊

Все подобные новости можно найти по хэштегу #FlutterPulseTips

#flutter #dart #flutterpulse #FlutterPulseTips #MobileDev #RxDart #DebounceTime #ButtonSpam #SpamProtection
👍2🔥1
Запускайте тесты на нескольких размерах экрана

Предотвратите переполнение для разных размеров экранов 🤯

Это позволит запустить тест с каждой конфигурацией экрана в screenSizeVariants 📱


final screenSizeVariants = ValueVariant<ScreenSize>(basicPhones);

testWidgets('''клик на кнопку => отображается закрепленный виджет наложения''', (
WidgetTester tester,
) async {
await tester.setScreenSize(screenSizeVariants.currentValue!);

await tester.pumpWidget(const MyAppWithCircleAnchored());
expect(find.byType(AnchoredHelper), findsNothing);
await tester.tap(find.byType(OutlinedButton).first);
await tester.pump(const Duration(seconds: 2));
expect(find.byType(AnchoredHelper), findsOneWidget);
}, variant: screenSizeVariants);



import 'dart:ui';
import 'package:flutter_test/flutter_test.dart';

// это определяет конфигурацию размера конкретного устройства
class ScreenSize {
// имя этой конфигурации
final String name;

// конфигурация размера и плотность пикселей
final double width, height, pixelDensity;

const ScreenSize(this.name, this.width, this.height, this.pixelDensity);

@override
String toString() => name;
}

extension ScreenSizeManager on WidgetTester {
Future<void> setScreenSize(ScreenSize screenSize) async {
return _setScreenSize(
width: screenSize.width,
height: screenSize.height,
pixelDensity: screenSize.pixelDensity,
);
}

Future<void> _setScreenSize({
double width = 540,
double height = 960,
double pixelDensity = 1,
}) async {
final size = Size(width, height);
await binding.setSurfaceSize(size);
binding.window.physicalSizeTestValue = size;
binding.window.devicePixelRatioTestValue = pixelDensity;
}
}


Все подобные новости можно найти по хэштегу #FlutterPulseTips 👍

Оцените новую рубрику в комментариях! 💬

#flutter #dart #flutterpulse #FlutterPulseTips #MobileDevelopment #TestingTips #ScreenSize #FlutterTips
👍1