Flutter Pulse
533 subscribers
357 photos
788 links
На канале будут новости про flutter с сайтов, информация об обновлении пакетов, а также авторский контент.
Download Telegram
Рисуем и анимируем круглый прогресс-бар с помощью Custom Painter

В этом совете мы рассмотрим, как создать анимированный круглый прогресс-бар, используя виджет CustomPaint во Flutter. Такой прогресс-бар можно использовать, например, для индикации загрузки.

Основные моменты:

1️⃣ Передача анимации в конструктор CustomPainter автоматически вызывает перерисовку.

2️⃣ При обновлении прогресса мы изменяем начало и конец анимации, а затем запускаем её. Поскольку время загрузки предсказать невозможно, анимация прогресс-бара продолжается после обновления прогресса.

Пример кода:



class RoundProgressPainter extends CustomPainter {
final double radius;
final double progress;
final Color color;
final Animation<double> animation;
final double strokeWidth;

RoundProgressPainter({
required this.radius,
required this.progress,
required this.color,
required this.animation,
required this.strokeWidth,
}) : super(repaint: animation);

@override
void paint(Canvas canvas, Size size) {
final center = Offset(size.width / 2, size.height / 2);
final progressAngle = math.pi * 2 * progress;
final progressPaint = Paint()
..color = color
..strokeWidth = strokeWidth
..style = PaintingStyle.stroke
..strokeCap = StrokeCap.round;

canvas.drawCircle(
center,
radius - strokeWidth / 2,
Paint()
..color = color.withOpacity(0.1)
..strokeWidth = strokeWidth
..style = PaintingStyle.stroke,
);

canvas.drawArc(
Rect.fromCircle(center: center, radius: radius),
-math.pi / 2,
progressAngle,
false,
progressPaint,
);
}

@override
bool shouldRepaint(RoundProgressPainter oldDelegate) =>
progress != oldDelegate.progress || color != oldDelegate.color;
}





class RoundProgress extends StatefulWidget {
final double radius;
final double progress;
final Color color;
final Widget? child;
final double strokeWidth;

const RoundProgress({
super.key,
required this.radius,
required this.progress,
required this.color,
this.child,
this.strokeWidth = 4.0,
});

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

class _RoundProgressState extends State<RoundProgress> with SingleTickerProviderStateMixin {
late AnimationController _controller;
late Animation<double> _animation;

@override
void initState() {
super.initState();
_controller = AnimationController(
vsync: this,
duration: const Duration(milliseconds: 300),
);
_animation = Tween(begin: 0.0, end: 1.0).animate(
CurvedAnimation(parent: _controller, curve: Curves.decelerate),
);
_controller.forward(from: 0);
}

@override
void dispose() {
_controller.dispose();
super.dispose();
}

@override
void didUpdateWidget(covariant RoundProgress oldWidget) {
super.didUpdateWidget(oldWidget);
if (widget.progress != oldWidget.progress && widget.progress != null) {
_animation = Tween(begin: oldWidget.progress, end: widget.progress).animate(
CurvedAnimation(parent: _controller, curve: Curves.easeIn),
);
_controller.forward(from: 0);
}
}

@override
Widget build(BuildContext context) {
return AnimatedBuilder(
animation: _animation,
builder: (context, child) => CustomPaint(
size: Size(widget.radius * 2, widget.radius * 2),
painter: RoundProgressPainter(
radius: widget.radius,
progress: widget.progress,
color: widget.color,
animation: _animation,
strokeWidth: widget.strokeWidth,
),
child: widget.child,
),
);
}
}



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

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

#flutter #dart #flutterpulse #FlutterPulseTips #MobileDevelopment #UI #Animation #CustomPainter #ProgressBar #LoadingAnimation #FlutterTips
👍2
Обзор пакетов на тему Dependency Injection & State Management (Обзор пакетов для внедрения зависимостей и управления состоянием)

Riverpod - реактивный фреймворк для кэширования и связывания данных в Flutter! 🚀
Пакет упрощает работу с асинхронным кодом, автоматически обрабатывая ошибки и состояния загрузки.
👍 Лайки: 3760, 📥 Скачиваний: 2.48М
Последнее обновление 📅: 10 месяцев назад
https://pub.dev/packages/riverpod

Get It - простой локатор сервисов для Flutter и Dart! 📈
Пакет позволяет доступ к объектам из любого места в приложении.
👍 Лайки: 4570, 📥 Скачиваний: 2.16М
Последнее обновление 📅: 25 дней назад
https://pub.dev/packages/get_it

Provider - пакет для упрощения работы с InheritedWidget и управления состоянием приложения! 📊
Пакет позволяет создавать, слушать и удалять ресурсы, а также обеспечивает ленивую загрузку и уменьшает количество boilerplate-кода.
👍 Лайки: 10800, 📥 Скачиваний: 4.92М
Последнее обновление 📅: 8 дней назад
https://pub.dev/packages/provider

Flutter Bloc - пакет для интеграции блоков и кубитов в Flutter! 📈
Пакет упрощает управление состоянием приложения.
👍 Лайки: 7820, 📥 Скачиваний: 2.66М
Последнее обновление 📅: 3 месяца назад
https://pub.dev/packages/flutter_bloc

BLoC - предсказуемая библиотека управления состоянием для реализации шаблона проектирования BLoC! 📊
Пакет помогает разделить представление и бизнес-логику, облегчая тестирование и повторное использование кода.
👍 Лайки: 3100, 📥 Скачиваний: 2.64М
Последнее обновление 📅: 7 месяцев назад
https://pub.dev/packages/bloc

#flutter #dart #pubdev #flutterpulse #flutterpulsethemedpackages #riverpod #getit #provider #flutterbloc #bloc
Самые лучшие обновлённые пакеты за последние 24 часа

google_sign_in_android 7.0.5
Пакет google_sign_in_android используется для реализации аутентификации Google на Android-устройствах. В новой версии добавлена поддержка параметра hostedDomain при аутентификации.
👍 Лайки: 12, 📥 Скачиваний: 908 000
https://pub.dev/packages/google_sign_in_android

flutter_map_marker_popup 8.1.0
Пакет flutter_map_marker_popup имеет 127 лайков и более 38 900 скачиваний. Теперь совместим с flutter_map 8.2.0. Используйте его, чтобы легко добавлять всплывающие подсказки к маркерам на картах в ваших приложениях Flutter.
👍 Лайки: 127, 📥 Скачиваний: 38.9К
https://pub.dev/packages/flutter_map_marker_popup

in_app_review 2.0.11
Пакет in_app_review позволяет показывать всплывающее окно для оставления отзыва о приложении без закрытия приложения, обновлён до версии 2.0.11. В этом обновлении был переработан плагин и перенесён код платформы Android с Java на Kotlin.
👍 Лайки: 2310, 📥 Скачиваний: 860 000
https://pub.dev/packages/in_app_review

Entry 1.0.2
Пакет Entry для Flutter позволяет анимировать появление виджетов.
В обновлении: улучшена работа с анимациями и оптимизирован код.
👍 Лайки: 310, 📥 Скачиваний: 3870
https://pub.dev/packages/entry

infinite_scroll_pagination 5.1.1
Теперь с исправленными ошибками null check в PagedLayoutBuilder, Bloc example state equality и Paging state hash code.
Также обновлено пример использования виджетов.
Пакет infinite_scroll_pagination имеет 3840 лайков и более 415000 скачиваний.
👍 Лайки: 3840, 📥 Скачиваний: 415 000
https://pub.dev/packages/infinite_scroll_pagination

zego_uikit_prebuilt_call 4.18.1
Этот пакет позволяет легко интегрировать голосовые и видеозвонки в ваше приложение.
В новой версии исправлена ошибка, связанная с открытием камеры во время аудиозвонка.
Пакет имеет 168 лайков и 6410 скачиваний.
👍 Лайки: 168, 📥 Скачиваний: 6410
https://pub.dev/packages/zego_uikit_prebuilt_call

#Flutter #Dart #PubDev #FlutterPulse #FlutterPulseBestPackages #google_sign_in_android #flutter_map_marker_popup #in_app_review #Entry #infinite_scroll_pagination #zego_uikit_prebuilt_call
Тестирование с навигацией GoRouter
Как запускать тесты с навигацией GoRouter

Иногда вам хочется быть уверенными, что некоторые виджеты перенаправляют на правильный маршрут.
Гораздо проще тестировать ваши страницы вне навигации, но это все равно может помочь в некоторых случаях.

Пример теста:



testWidgets('условие защиты возвращает false => переход на ошибочный url',
(WidgetTester tester) async {
final app = MaterialApp.router(
routerConfig: GoRouter(
initialLocation: '/page1',
routes: [
GoRoute(
path: '/page1',
builder: (context, state) => Guard(
canActivate: future.value(false),
fallbackRoute: '/page2',
),
child: const FakePage(msg: 'page1'),
),
GoRoute(
path: '/page2',
builder: (context, state) => const FakePage(msg: 'page2'),
),
],
),
);

await tester.pumpWidget(app);
await tester.pumpAndSettle(const Duration(milliseconds: 100));

expect(find.text('page2'), findsOneWidget);
});



Дополнительный совет:
Вы можете использовать ваш app router, чтобы получить точно такое же поведение маршрутизации, как и в вашем приложении.
Таким образом, вы действительно можете проверить, работает ли навигация корректно.
Встройте создание GoRouter в функцию с параметром initialLocation, чтобы ваш тест мог начинаться прямо с того места, которое вам нужно.



GoRouter createRouter(final String initialLocation) {
return GoRouter(
initialLocation: initialLocation,
routes: [
GoRoute(
path: '/page1',
builder: (context, state) => const FakePage(msg: 'page1'),
),
GoRoute(
path: '/page2',
builder: (context, state) => const FakePage(msg: 'page2'),
),
],
);
}



Оцените новую рубрику по тестированию Flutter-приложений! 👍
Все подобные новости можно найти по хэштегу #FlutterPulseTips
#flutter #dart #flutterpulse #FlutterPulseTips #MobileAppDevelopment #FlutterTips #Testing #GoRouter
2👍2
Обзор пакетов на тему "Выбор файлов" для Flutter 📁

Easy Folder Picker 📂
Легкий и удобный способ выбора директорий в вашем приложении. Пакет автоматически запрашивает необходимые разрешения. Поддерживает только Android.
👍 Лайки: 34, 📥 Скачиваний: 266
Последнее обновление 📅: 6 месяцев назад
https://pub.dev/packages/easy_folder_picker

FormBuilder File Picker 📝
Пакет позволяет легко добавлять поля для выбора файлов в ваши формы Flutter. Он поддерживает автоматическое получение разрешений, предварительный просмотр изображений и многое другое.
👍 Лайки: 60, 📥 Скачиваний: 2.7К
Последнее обновление 📅: 4 месяца назад
https://pub.dev/packages/form_builder_file_picker

Full Picker 📸
Пакет позволяет легко выбирать файлы в разных режимах, включая выбор нескольких файлов, сжатие видео, обрезку изображений, использование камеры и многое другое.
👍 Лайки: 37, 📥 Скачиваний: 247
Последнее обновление 📅: 8 месяцев назад
https://pub.dev/packages/full_picker

desktop_drop 🖥️
Позволяет пользователям перетаскивать файлы в ваши десктоп-приложения. Поддерживает Windows, Linux, macOS, Android (preview) и Web.
👍 Лайки: 426, 📥 Скачиваний: 300К
Последнее обновление 📅: 38 дней назад
https://pub.dev/packages/desktop_drop

File Picker 📁
Пакет позволяет использовать системный файловый менеджер для выбора одного или нескольких файлов, с поддержкой фильтрации по расширениям. Поддерживает множество платформ, включая Mobile, Web и Desktop.
👍 Лайки: 4780, 📥 Скачиваний: 2.4М
Последнее обновление 📅: 8 дней назад
https://pub.dev/packages/file_picker

Flutter Dropzone 🌐
Пакет для обработки перетаскивания файлов в Flutter Web. Используйте его для создания зон перетаскивания файлов в ваших веб-приложениях.
👍 Лайки: 212, 📥 Скачиваний: 126К
Последнее обновление 📅: 9 месяцев назад
https://pub.dev/packages/flutter_dropzone

#FilePicker #Flutter #Dart #PubDev #FlutterPulse #FlutterPulseThemedPackages #EasyFolderPicker #FormBuilderFilePicker #FullPicker #desktop_drop #FlutterDropzone
Привет, разработчики! 🤩 Сегодня у нас есть интересная новость для всех, кто работает с Flutter и Dart! 💻📱

Вы знали, что InheritedWidget - это мощный инструмент для передачи данных по дереву виджетов? 🤔 Это виджет, который позволяет вам передавать данные дальше по дереву, без необходимости прокидывать их через конструкторы. 📈

В новой статье подробно рассказывается о том, как работает InheritedWidget и как его использовать. Вы узнаете, как создать свой собственный виджет, который наследует данные от родительского виджета, и как использовать его в своих приложениях. 📚

И самое главное - это только начало! 🎉 Скоро будет рассказано про Provider, который является оберткой для InheritedWidget. Не пропустите! 📣

Хотите быть в курсе всех последних новостей и обновлений в мире Flutter и Dart? 🤔 Тогда обязательно подпишитесь на наш канал flutterpulse! 📲

#flutter #dart #flutterpulse 💻📱👍
Самые лучшие обновлённые пакеты за последние 24 часа

purchases_flutter 9.3.0
Плагин для Flutter, который позволяет автоматически собирать идентификаторы устройств и обновлены зависимости.
👍 Лайки: 833, 📥 Скачиваний: 174К
https://pub.dev/packages/purchases_flutter

go_router 16.2.1
Декларативный пакет маршрутизации для Flutter, который использует Router API для предоставления удобного, основанного на URL, API для навигации между разными экранами.
Теперь пакет имеет более чем 5 450 лайков и 2 020 000 скачиваний.
В новой версии добавлена тема восстановления состояния в документацию.
👍 Лайки: 5 450, 📥 Скачиваний: 2.0М
https://pub.dev/packages/go_router

shadcn_ui 0.29.1
Пакет содержит множество настраиваемых UI-компонентов для Flutter.
Теперь в ShadInput, ShadInputFormField, ShadTextArea и ShadTextAreaFormField добавлен параметр alignment.
👍 Лайки: 705, 📥 Скачиваний: 15.2К
https://pub.dev/packages/shadcn_ui

dwds 25.1.0
Пакет для настройки поведения DDS через DartDevelopmentServiceConfiguration и поддержка службы DevTools.
Старые свойства DebugSettings deprecated.
👍 Лайки: 30, 📥 Скачиваний: 4.1М
https://pub.dev/packages/dwds

go_router_builder 4.0.0
Пакет используется для создания типобезопасных маршрутов в приложениях Flutter с помощью go_router.
Теперь миксины Route стали публичными.
👍 Лайки: 265, 📥 Скачиваний: 174К
https://pub.dev/packages/go_router_builder

health 13.1.4
Пакет позволяет читать и записывать данные о здоровье из/в Apple Health и Google Health Connect.
В новой версии исправлена ошибка, которая вызывала крах на iOS при добавлении данных о медитации, а также добавлена поддержка SPM для iOS.
👍 Лайки: 623, 📥 Скачиваний: 46.5К
https://pub.dev/packages/health

#Flutter #Dart #PubDev #FlutterPulse #FlutterPulseBestPackages #purchases_flutter #go_router #shadcn_ui #dwds #go_router_builder #health
Привет, программисты! 🤩 У меня есть супер-крутая новость для вас! 📣 Только что вышло новое видео с практическим примером реализации анимации контента при прокрутке 📌, и это просто МОЛОТ! 🤯 Вы можете найти его по ссылке: #video. Если вы хотите быть в курсе всех последних новостей и обновлений из мира Flutter и Dart, то обязательно стоит подписаться на канал flutterpulse 📊, чтобы не пропустить ничего интересного! 😉 Новость взял отсюда #flutter #dart #flutterpulse 🚀
Правильно называйте свои классы
🤔 Название класса должно отражать его сущность, а не выполняемые им действия! 💡

При именовании классов важно следовать правилу: класс должен называться тем, чем он является, а не тем, что он делает. Это делает ваш код более читаемым и понятным. 📚

👀 Рассмотрим пример на Dart:

class EmailValidator { // Неправильное название, так как оно описывает действие
EmailValidator();

void validate(String email) {
const pattern = r'...'; // Регулярное выражение для проверки email
final regex = RegExp(pattern);
final isValidEmail = regex.hasMatch(email);
if (!isValidEmail) {
throw const EmailException("Email not valid"); // Ошибка, если email не валиден
}
}
}



class Email { // Правильное название, отражает сущность класса
final String _value;
Email(String email) : _value = email.trim();

void validate() {
const pattern = r'...'; // Регулярное выражение для проверки email
final regex = RegExp(pattern);
final isValidEmail = regex.hasMatch(_value);
if (!isValidEmail) {
throw const EmailException("Email not valid"); // Ошибка, если email не валиден
}
}
}


В первом примере класс назван EmailValidator, что указывает на выполняемое действие (валидация email). Это не отражает суть класса. 🔴
Во втором примере класс назван Email, что отражает его сущность (email). Это делает код более логичным и понятным. 🟢

👍 Оцените новую рубрику и напишите своё мнение! 💬

Все подобные советы можно найти по хэштегу #FlutterPulseTips
#flutter #dart #flutterpulse #FlutterPulseTips #CodingTips #MobileDevelopment #CleanCode #ProgrammingTips
Обзор пакетов на тему Social Media

Social Media Recorder 📻
Пакет для Flutter, позволяющий легко записывать аудио с микрофона и сохранять его в файл на Android и iOS. Поддерживает различные кодеки, включая AAC, AMR и OPUS.
👍 Лайки: 173, 📥 Скачиваний: 668
📅 Последнее обновление: 7 месяцев назад
https://pub.dev/packages/social_media_recorder

Like Button ❤️
Пакет для Flutter, позволяющий создавать кнопки лайков с анимационными эффектами, похожими на сердечки в Twitter.
👍 Лайки: 1400, 📥 Скачиваний: 17.9К
📅 Последнее обновление: 3 месяца назад
https://pub.dev/packages/like_button

Flutter Link Previewer 🔗
Пакет для рендеринга превью ссылок в Flutter-приложениях. Автоматически извлекает метаданные (заголовок, описание, изображение) и отображает их в анимированной карточке.
👍 Лайки: 350, 📥 Скачиваний: 67.8К
📅 Последнее обновление: 34 дня назад
https://pub.dev/packages/flutter_link_previewer

AnyLinkPreview 🤓
Пакет для Flutter, позволяющий красиво отображать превью ссылок в вашем приложении с возможностью кастомизации.
👍 Лайки: 471, 📥 Скачиваний: 26.1К
📅 Последнее обновление: 7 месяцев назад
https://pub.dev/packages/any_link_preview

tiktoklikescroller 📹
Пакет для Flutter, позволяющий создать полноэкранный вертикальный скроллер, похожий на TikTok, с анимированными переходами между страницами и настраиваемыми параметрами скроллинга.
👍 Лайки: 229, 📥 Скачиваний: 2.4К
📅 Последнее обновление: 11 месяцев назад
https://pub.dev/packages/tiktoklikescroller

Persistent Shopping Cart 🛍️
Пакет для Flutter, предоставляющий простую и персистентную функциональность корзины покупок для вашего мобильного приложения.
👍 Лайки: 271, 📥 Скачиваний: 171
📅 Последнее обновление: 7 месяцев назад
https://pub.dev/packages/persistent_shopping_cart

#SocialMedia #Flutter #Dart #PubDev #FlutterPulse #FlutterPulseThemedPackages #SocialMediaRecorder #LikeButton #FlutterLinkPreviewer #AnyLinkPreview #Tiktoklikescroller #PersistentShoppingCart