Flutter Pulse
417 subscribers
271 photos
542 links
На канале будут новости про flutter с сайтов, информация об обновлении пакетов, а также авторский контент.
Download Telegram
Новые пакеты за неделю! 🚀

Filterator - мощный инструмент для построения структурированных API-запросов с поддержкой фильтрации, сортировки, пагинации и конвертации в различные форматы. 💻
👍 Лайки: 18, 📥 Скачиваний: 290
https://pub.dev/packages/filterator

Rive Native - новый рантайм, позволяющий отображать и взаимодействовать с графикой Rive в вашем приложении Flutter.
👍 Лайки: 43, 📥 Скачиваний: 713
https://pub.dev/packages/rive_native

gizmos_settings_screen - пакет для создания настраиваемых экранов настроек для ваших приложений.
👍 Лайки: 19, 📥 Скачиваний: 114
https://pub.dev/packages/gizmos_settings_screen

prime - библиотека полезных и многоразовых методов и расширений для Dart.
👍 Лайки: 2, 📥 Скачиваний: 265
https://pub.dev/packages/prime

#Filterator #RiveNative #gizmos_settings_screen #prime #flutter #dart #pubdev #flutterpulse
Обновлённые пакеты за последние 24 часа, получившие наибольшее число лайков

Video Player обновился до версии 2.10.0
Плагин для Flutter, который позволяет проигрывать видео на устройствах под iOS, Android и веб-платформах. В новой версии добавлена поддержка платформенных представлений (platform views) для отображения видео на Android и iOS.
👍 Лайки: 3540, 📥 Скачиваний: 2.1М
https://pub.dev/packages/video_player

Flutter Sliders обновился до версии 29.1.39
Пакет для создания интерактивных слайдеров в Flutter-приложениях. Теперь минимальная версия Dart - 3.7.
👍 Лайки: 963, 📥 Скачиваний: 70.7К
https://pub.dev/packages/syncfusion_flutter_sliders

Flutter PDF Viewer обновился до версии 29.2.8
Библиотека для просмотра PDF-документов на платформах Android, iOS, Web, Windows и macOS. В новой версии исправлены ошибки и улучшена работа с масштабированием.
👍 Лайки: 1060, 📥 Скачиваний: 178К
https://pub.dev/packages/syncfusion_flutter_pdfviewer

Syncfusion Flutter DataGrid обновился до версии 29.2.8
Пакет для отображения и манипулирования данными в табличном виде в приложениях Flutter. В новой версии улучшена производительность и добавлены новые функции.
👍 Лайки: 824, 📥 Скачиваний: 59.9К
https://pub.dev/packages/syncfusion_flutter_datagrid

Flutter Calendar обновился до версии 29.1.39
Пакет для создания календарей в приложениях Flutter. В новой версии исправлены ошибки и обновлена минимальная версия Dart до 3.7.
👍 Лайки: 1510, 📥 Скачиваний: 79.5К
https://pub.dev/packages/syncfusion_flutter_calendar

#flutter #dart #pubdev #flutterpulse #videoplayer #fluttersliders #flutterpdfviewer #syncfusionflutterdatagrid #fluttercalendar
Flutter Pulse pinned «Сегодня произойдут небольшие изменения на канале! Надеюсь, они вам понравятся! Как думаете, что изменится?»
🚀 Нас уже больше 400! 🎉
Спасибо каждому, кто читает, комментирует и заряжает канал энергией Flutter! 💙
В честь этой мини-юбилейной отметки — пора внести немного свежего воздуха 💨 и объявить о небольших, но важных изменениях 👇

📊 Изменения в новостях о пакетах:

🧠 В недавнем опросе правильными были варианты:
«Уменьшится количество новостей»
«Произойдёт модернизация старой рубрики»
«Добавится новая рубрика»
Конечно, администратор канала, название и направление развития не изменится! 😄

🤔 Почему? Показалось, что слишком много контента про обновления пакетов. Было две новости, стало одна — лаконичнее и полезнее!

🕘 Теперь она будет выходить каждый день в 9:00 по Москве
📦 В ней: топ-обновлённые пакеты, changelog и версии (теперь без багов — спасибо новому парсеру 🙌)
📌 Новый хэштег: #FlutterPulseBestPackages

📬 А рубрика про новые пакеты останется на месте — еженедельно, по понедельникам в 18:00
📌 Хэштег: #FlutterPulseBestNewPackages

🆕 Новая рубрика — Flutter-гайды!
Да, теперь на канале будут мои личные советы и гайды по Flutter 🧑‍🏫
Коротко, чётко, с примерами и по делу!

📅 Каждый день в 13:00 по Москве
📌 Хэштег: #FlutterPulseTips

👉 Первый выпуск уже СЕГОДНЯ!

💬 Очень жду от вас фидбэка:
Что бы вы хотели видеть на канале? Что нравится? Что можно улучшить?
Лайки, комментарии, идеи — всё читаю и ценю 🙏

Спасибо, что вы со мной 💙
#FlutterPulse #FlutterPulseBestPackages #FlutterPulseBestNewPackages #FlutterPulseTips #Flutter #Dart #PubDev
Умный запрос оценки
Не спамите запросом оценки! 🤔

Почему?
• Apple Store ограничивает запрос оценки через нативное всплывающее окно до 2 раз в год 📆
• Google Play Store ограничивает запрос почти 2 раза каждые 3 месяца... 🤷‍♂️
• Вы не хотите раздражать пользователей и получать плохие оценки 😠

Мы создаем метод, подобный showDialog, чтобы можно было запрашивать оценку где угодно в приложении 📱


class RatingSettings {
final Duration delayBeforeAsking;
final Duration delayBeforeAskingAgain;

RatingSettings({
required this.delayBeforeAsking,
required this.delayBeforeAskingAgain,
});
}

class Rating {
final RatingApi _ratingApi;
final RatingSettings settings;
final DateTime? lastAskingDate;
final DateTime userCreationDate;
final DateTime _current;
final bool hasRateApp;

Rating({
required this.settings,
required RatingApi ratingApi,
required this.lastAskingDate,
required this.userCreationDate,
required this.hasRateApp,
}) : _ratingApi = ratingApi,
_current = DateTime.now();

bool shouldAsk() {
// Если пользователь уже оценил приложение или мы не знаем дату создания пользователя, пропустим
if (userCreationDate == null || hasRateApp) {
return false;
}

final appInstallDiff = _current.difference(userCreationDate);
if (appInstallDiff < settings.delayBeforeAsking) {
return false;
}

if (lastAskingDate == null) {
return true;
}
return lastAskingDate!.difference(_current) > settings.delayBeforeAskingAgain;
}

Future<void> openStoreListing() => _ratingApi.openStoreListing();
Future<void> showRatingDialog() => _ratingApi.showRatingDialog();
}



void showRatingPopup(WidgetRef ref) {
final ratingRepository = ref.watch(ratingRepositoryProvider);
final userState = ref.watch(userStateNotifierProvider);
final ratingFuture = ratingRepository.getUserState(user);

ratingFuture.then((rating) {
if (rating.shouldAsk()) {
rating.delay();
showDialog(
context: context,
builder: (context) => AlertDialog.adaptive(
title: const Text('Спасибо за использование ULY'),
content: const Text('У вас есть минута, чтобы оставить отзыв?'),
actions: [
TextButton(
child: const Text('Позже'),
onPressed: () async {
Navigator.of(context).pop();
},
),
TextButton(
child: const Text('Да, конечно!'),
onPressed: () async {
Navigator.of(context).pop();
rating.rate();
},
),
],
),
);
}
});
}


Вы можете хранить RatingSettings в Firebase Remote Config, чтобы регулировать эти настройки без пересборки приложения и находить оптимальные значения 🔧

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

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

#flutter #dart #flutterpulse #FlutterPulseTips #MobileDev #AppDev #SmartRating #RatingSystem #UXTips
Flutter Pulse pinned «🚀 Нас уже больше 400! 🎉 Спасибо каждому, кто читает, комментирует и заряжает канал энергией Flutter! 💙 В честь этой мини-юбилейной отметки — пора внести немного свежего воздуха 💨 и объявить о небольших, но важных изменениях 👇 📊 Изменения в новостях о пакетах:…»
Обзор пакетов на тему Тестирование

test - стандартный способ написания и запуска тестов для Dart. 👍 Лайки: 591, 📥 Скачиваний: 5.79М
Последнее обновление 📅: 14 дней назад
https://pub.dev/packages/test

Mocktail - библиотека для создания моков в Dart, вдохновленная Mockito. 👍 Лайки: 1170, 📥 Скачиваний: 2.58М
Последнее обновление 📅: 11 месяцев назад
https://pub.dev/packages/mocktail

platform - универсальная абстракция для Dart, предоставляющая доступ к информации о платформе. 👍 Лайки: 110, 📥 Скачиваний: 5.33М
Последнее обновление 📅: 7 месяцев назад
https://pub.dev/packages/platform

mockito - библиотека для создания моков в Dart, упрощающая тестирование кода. 👍 Лайки: 1460, 📥 Скачиваний: 1.64М
Последнее обновление 📅: 43 дня назад
https://pub.dev/packages/mockito

Faker - генерирует фейковые данные для ваших проектов, такие как email, логины, имена и адреса. 👍 Лайки: 897, 📥 Скачиваний: 1.21М
Последнее обновление 📅: 9 месяцев назад
https://pub.dev/packages/faker

coverage - сбор, обработка и форматирование данных о покрытии кода. 👍 Лайки: 126, 📥 Скачиваний: 6.95М
Последнее обновление 📅: 9 дней назад
https://pub.dev/packages/coverage

#test #mocktail #platform #mockito #faker #coverage #dart #pubdev #flutterpulse #flutterpulsethemedpackages
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥 ТОП-9 самых просматриваемых Flutter-видео недели! 🔥
Неделя выдалась насыщенной: живой код, полезные туториалы, разговоры с гуру Dart и даже 24-часовой марафон 💻
Готовь чай, кофе (или что покрепче?) и открывай YouTube — есть, что посмотреть 👇

1. 🕒📱 Just coding | Observable Flutter #62
Крейг Лабенз снова в деле! Почти два часа лайв-кодинга на Dart от официального канала Flutter.
1 час 40 мин | 👀 11,957 просмотров
🔗 https://www.youtube.com/watch?v=wKWsP2TXVvg

2. 📚 Что такое List в Dart? || Урок Flutter
Ты уверен, что знаешь всё про списки? Создание, добавление, удаление и даже цикл по ним — всё за 12 минут!
12 мин | 👀 1,007 просмотров
🔗 https://www.youtube.com/watch?v=d-utuAcdBng

3. 📦 Barcode Generator App In Flutter
Настоящий DIY: делаем генератор штрих-кодов на Flutter. Без боли и сложностей.
23 мин | 👀 787 просмотров
🔗 https://www.youtube.com/watch?v=-gLxRVeSyvA

4. 💬 Humpday Q&A/AMA с Craig Labenz
Хотел задать Крейгу вопрос о Flutter? Кто-то уже сделал это за тебя — смотри!
2 часа 50 мин | 👀 485 просмотров
🔗 https://www.youtube.com/watch?v=HryfB44en0w

5. 🔮 Flutter — будущее разработки в 2025 году
Прогнозы, аргументы и немного философии: почему Flutter всё ещё топ и что дальше.
1 час 8 мин | 👀 370 просмотров
🔗 https://www.youtube.com/watch?v=3uCNx_WN8SI

6. 🧪 24 часа живого кодинга
Серьёзно. 24 часа. Живого. Кодинга. Полноценное приложение с бэкендом. Смотреть выборочно, но вдохновиться — обязательно.
24 часа | 👀 274 просмотра
🔗 https://www.youtube.com/watch?v=J_fEMlcmsXg

7. 🧠 Introduction to Flutter Test Mock Canvas
Mock Canvas в тестах Flutter — не страшно и даже интересно! Узнай, как он работает.
— | 👀 234 просмотра
🔗 https://www.youtube.com/watch?v=QbPm-Pe-4lw

8. 🔐 Password Manager на Flutter
Стажёр делает финальный проект: безопасный менеджер паролей. Держим за него кулачки и учимся.
2 часа 30 мин | 👀 214 просмотров
🔗 https://www.youtube.com/watch?v=w4kQk5zLlJA

9. 🧱 Flutter REST API PUT Method + Bloc
Чистая архитектура, Bloc, PUT-запросы и больше слов, которые нравятся архитекторам.
16 мин | 👀 60 просмотров
🔗 https://www.youtube.com/watch?v=geUYFj2hpTc

Если ты учишься, работаешь или просто фанатеешь от Flutter — это всё тебе 😎
Сохраняй, делись и развивай свой скилл вместе с Flutter-сообществом!
Не забываем лайкать! Это вдохновляет заниматься каналом больше!

#Flutter #Dart #FlutterPulse #FlutterPulseYouTube #PubDev #FlutterDev #FlutterВидео #FlutterОбучение #ObservableFlutter #CraigLabenz
Лучшие обновленные пакеты за последние 24 часа!

mobile_scanner 7.0.1
Пакет для Flutter, позволяющий сканировать штрих-коды и QR-коды с помощью камеры устройства. В новой версии добавлена обработка ошибок при вызове метода `MobileScannerController.start` без активного виджета `MobileScanner`.
👍 Лайки: 2.04К, 📥 Скачиваний: 463К
https://pub.dev/packages/mobile_scanner

coverage 1.14.1
Пакет для сбора, манипуляции и форматирования данных о покрытии кода в Dart. В новой версии удалена зависимость от пакета pubspec_parse и исправлена ошибка, которая могла возникнуть при попытке возобновить основной изолят из-за отключения службы VM.
👍 Лайки: 126, 📥 Скачиваний: 7.22М
https://pub.dev/packages/coverage

board_datetime_picker 2.7.0
Пакет для Flutter, позволяющий легко выбирать дату и время с помощью календаря и пикера. Теперь добавлена возможность выбора диапазона дат в режиме мультивыбора.
👍 Лайки: 210, 📥 Скачиваний: 4.24К
https://pub.dev/packages/board_datetime_picker

checked_yaml 2.0.4
Пакет для безопасной и удобной работы с YAML-файлами в Dart. В новой версии добавлено требование использования Dart 3.8.
👍 Лайки: 34, 📥 Скачиваний: 5.33М
https://pub.dev/packages/checked_yaml

material_color_utilities 0.13.0
Пакет для работы с цветовой системой Material Design 3, включая выбор темы из изображений и создание тонов цветов. В новой версии все поля MaterialDynamicColors стали финальными, а также теперь требуется Dart 3.5.
👍 Лайки: 240, 📥 Скачиваний: 5.21М
https://pub.dev/packages/material_color_utilities

bdd_widget_test 1.8.2
Библиотека для написания тестов для Flutter-виджетов в стиле BDD (Behavior-Driven Development), используя язык Gherkin. В новой версии исправлена проблема с предупреждениями линтера.
👍 Лайки: 167, 📥 Скачиваний: 86.6К
https://pub.dev/packages/bdd_widget_test

#mobile_scanner #coverage #board_datetime_picker #checked_yaml #material_color_utilities #bdd_widget_test #flutter #dart #pubdev #FlutterPulse #FlutterPulseBestPackages
Как показать уведомление Toast с Riverpod
Избавляемся от требования BuildContext

При разработке Flutter-приложений часто возникает необходимость отображать уведомления или сообщения Toast. Использование Riverpod для управления состоянием приложения позволяет упростить этот процесс. В этой статье мы рассмотрим, как показать уведомление Toast, используя Riverpod, и избавимся от необходимости передавать BuildContext.

Для начала нам нужно создать провайдер, который будет отвечать за отображение Toast-уведомлений. Мы будем использовать пакет another_flushbar для отображения уведомлений.


import 'package:another_flushbar/flushbar.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';

// Это наш провайдер из riverpod для вызова метода toast из любой функции riverpod
final toastProvider = Provider<ToastBuilder>((ref) => ToastBuilder());

class ToastBuilder {
void success({
required String title,
required String text,
}) {
// Продолжительность показа уведомления
Duration duration = const Duration(seconds: 3);
_showSuccessToast(
context: navigatorKey.currentContext!, // Используем глобальный ключ навигации
title: title,
text: text,
duration: duration,
);
}

void _showSuccessToast({
required BuildContext context,
required String title,
required String text,
required Duration duration,
}) {
// Хак, чтобы предотвратить показ toast во время тестов
if (Platform.environment.containsKey('FLUTTER_TEST')) {
return;
}
if (!context.mounted) {
return; // Проверяем, смонтирован ли контекст
}

// Используем пакет another_flushbar, но есть много других отличных решений
Flushbar(
flushbarPosition: FlushbarPosition.TOP,
title: title,
message: text,
// Здесь можно добавить стили
).show(context);
}
}


Далее, нам нужно создать глобальный ключ навигации, чтобы избавиться от требования BuildContext:

/// Не забудьте создать этот глобальный ключ и добавить его в ваш основной маршрутизатор
final navigatorKey = GlobalKey<NavigatorState>();


Теперь мы можем использовать наш провайдер toastProvider в любом месте приложения, где доступен Riverpod, чтобы показать Toast-уведомление:

import 'package:flutter_riverpod/flutter_riverpod.dart';

@Riverpod(keepAlive: false)
class EditAlbumNotifier extends _$EditAlbumNotifier {
// ...

Future<void> save() async {
// ...
// Например, после сохранения альбома
ref.read(toastProvider).success(
title: "Успех",
text: "Журнал архивирован",
);
}
}


Таким образом, мы можем легко отображать Toast-уведомления в нашем Flutter-приложении, используя Riverpod и пакет another_flushbar, а также избавиться от необходимости передавать BuildContext, используя глобальный ключ навигации.

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

Все подобные новости можно найти по хэштегу #FlutterPulseTips
#flutter #dart #flutterpulse #FlutterPulseTips #MobileDev #Riverpod #ToastNotifications #FlutterTips
Обзор пакетов на тему Производительность и Анализ Крашей

sentry_flutter (8.14.2) - пакет для отслеживания ошибок и крашей в ваших Flutter-приложениях, включая native-слой.
👍 Лайки: 986, 📥 Скачиваний: 667К
Последнее обновление 📅: 48 дней назад
https://pub.dev/packages/sentry_flutter

firebase_performance (0.10.1+6) - пакет для использования Firebase Performance API в ваших Flutter-приложениях.
👍 Лайки: 221, 📥 Скачиваний: 40.7К
Последнее обновление 📅: 15 дней назад
https://pub.dev/packages/firebase_performance

sentry (8.14.2) - пакет Sentry SDK для Dart, позволяющий отслеживать ошибки и исключения в ваших приложениях на основе Dart.
👍 Лайки: 524, 📥 Скачиваний: 756К
Последнее обновление 📅: 48 дней назад
https://pub.dev/packages/sentry

leak_tracker (11.0.1) - пакет для обнаружения проблем с памятью в приложениях на Dart и Flutter.
👍 Лайки: 149, 📥 Скачиваний: 3.75М
Последнее обновление 📅: 44 дня назад
https://pub.dev/packages/leak_tracker

firebase_crashlytics (4.3.6) - плагин для отслеживания и анализа ошибок в ваших Flutter-приложениях.
👍 Лайки: 1240, 📥 Скачиваний: 1.36М
Последнее обновление 📅: 15 дней назад
https://pub.dev/packages/firebase_crashlytics

flutter_bugly (1.1.0) - пакет для работы с сервисом Tencent Bugly, позволяющий собирать статистику, отправлять отчеты об ошибках и обновлять приложения.
👍 Лайки: 66, 📥 Скачиваний: 1.04К
Последнее обновление 📅: 2 месяца назад
https://pub.dev/packages/flutter_bugly

#flutter #dart #pubdev #flutterpulse #flutterpulsethemedpackages #sentry_flutter #firebase_performance #sentry #leak_tracker #firebase_crashlytics #flutter_bugly
Лучшие обновленные пакеты за последние 24 часа!

dds 5.0.3
Пакет для запуска сервиса Dart Developer Service (DDS). Улучшена обработка ошибок и добавлена поддержка клиентской пагинации.
👍 Лайки: 16, 📥 Скачиваний: 3.03М
https://pub.dev/packages/dds

syncfusion_flutter_datepicker 29.1.39
Пакет для выбора дат или диапазонов дат в Flutter-приложениях. Теперь поддерживает Dart версии 3.7 и выше.
👍 Лайки: 1580, 📥 Скачиваний: 213К
https://pub.dev/packages/syncfusion_flutter_datepicker

syncfusion_flutter_core 29.1.39
Зависимый пакет для ряда виджетов Syncfusion Flutter. Обновлена минимальная версия Dart до 3.7.
👍 Лайки: 236, 📥 Скачиваний: 653К
https://pub.dev/packages/syncfusion_flutter_core

vm_service 15.0.2
Библиотека для доступа к протоколу обслуживания виртуальной машины Dart. Добавлено поле kTimerSignificantlyOverdue к EventKind.
👍 Лайки: 55, 📥 Скачиваний: 7.2М
https://pub.dev/packages/vm_service

syncfusion_flutter_charts 29.2.4
Библиотека для создания графиков в приложениях Flutter. Исправлена ошибка, связанная с работой легенды.
👍 Лайки: 3490, 📥 Скачиваний: 237К
https://pub.dev/packages/syncfusion_flutter_charts

just_audio 0.10.4
Пакет для создания аудиоплееров для Android, iOS, macOS, web, Linux и Windows. Исправлены ошибки одновременной загрузки аудиофайлов и другие.
👍 Лайки: 3940, 📥 Скачиваний: 648К
https://pub.dev/packages/just_audio

#Flutter #Dart #pubdev #FlutterPulse #FlutterPulseBestPackages #dds #syncfusion_flutter_datepicker #syncfusion_flutter_core #vm_service #syncfusion_flutter_charts #just_audio
Как открыть страницу настроек приложения в системе
Привет, друзья! 👋 Сегодня мы поделимся с вами полезным советом о том, как открыть страницу настроек вашего приложения на устройстве пользователя. 📱💻

Зачем это нужно? 🤔
Например, если пользователь отклонил уведомления, система больше не будет запрашивать разрешение. В этом случае вы можете помочь пользователю перейти в настройки и включить уведомления вручную. 🔔

Используем 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();



Оцените новую рубрику и напишите в комментариях, что вы думаете о ней! 💬 Все подобные новости можно найти по хэштегу #FlutterPulseTips
#flutter #dart #flutterpulse #FlutterPulseTips #MobileDev #AppDev #ProgrammingTips #CodingTips
Привет, разработчики Flutter! 🚀 👋

Анна, Friflex Flutter Team Lead, сегодня хочет нам рассказать вам о Platform Channels - основном механизме общения нативного и Dart-кода во Flutter-приложениях 🤝. Это общий термин для названия всех видов каналов, и он очень важен для получения информации из платформы или использования ее функционала 📊.

Есть три вида платформенных каналов:
▫️ MethodChannel - канал для одноразовых асинхронных вызовов методов платформы 📞
▫️ EventChannel - канал для непрерывного общения с платформой 📺
▫️ BasicMessageChannel - канал для простого асинхронного обмена сообщениями с платформой 📨

При создании каналов каждому необходимо задавать свой уникальный строковый идентификатор 📝. С помощью него платформа и Flutter «стыкуются» - образуется некий мост, по которому идет передача данных 🌉.

На примере плагина permission_handler мы можем увидеть, как настраивается общение с платформой 📈. В Dart-коде создается экземпляр MethodChannel, а в нативном коде Android - подключается обработчик вызовов 📊.

Если вы хотите узнать больше о Platform Channels и как они работают, то переходите по ссылке и читайте полную статью 📄

Не забудьте подписаться на канал flutterpulse, чтобы быть в курсе всех последних новостей и обновлений в мире Flutter 📱!

#flutter #dart #flutterpulse ❤️