DevGang
Авторизоваться

Учебное пособие по локальным уведомлениям в Flutter — Потрясающие уведомления, внедрение зависимостей, маршрутизация, Riverpod и многое другое

Почти в каждом производственном приложении есть функция локального уведомления. Разработчикам необходимо внедрять функции уведомлений в свои приложения. Некоторые разработчики Flutter предпочитают использовать пакет local_notifications, но большее количество предпочитает пакет awesome_notifications, поскольку он более настраиваемый.

Мотивация

Разработчикам Flutter, в приложениях, например, как Voltran, нужно было создать локальную функцию фоновых уведомлений для Voltran. Поскольку пакет awesome_notifications более настраиваемый, выберем для рассмотрения именно его. Было замечено, что пакет получил новое обновление.

С обновленной версией пакета Awesome Notifications некоторые задачи изменились. Вы могли бы использовать потоки со старой версией, но сейчас вы не можете использовать ее из-за некоторых проблем. Например, посмотрите на приведенное ниже изображение:

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

Затем, после внедрения уведомлений, было записано новое видео в YouTube. Если вам нужна более подробная информация об управления уведомлениями, можете ознакомиться здесь

Проект - awesome_notifications_with_riverpod

Во-первых, давайте посмотрим на пакеты, которые находятся в файле pubspec.yaml.

dependencies:
  flutter:
    sdk: flutter
  auto_route: ^5.0.1
  flutter_riverpod: ^2.0.0
  awesome_notifications: ^0.7.1
  get_it: ^7.2.0
  injectable: ^1.5.3
  freezed_annotation: ^2.1.0
  cupertino_icons: ^1.0.2

dev_dependencies:
  flutter_test:
    sdk: flutter
  auto_route_generator: ^5.0.2
  build_runner: ^2.2.1
  injectable_generator: ^1.5.4
  freezed: ^2.0.4

После выполнения команды flutter pub get мы можем перейти к архитектуре папок, которая на самом деле является DDD (Domain Driven Design). Архитектурой DDD довольно легко читать и управлять.

final getIt = GetIt.instance;

@InjectableInit()
void configureDependencies() => $initGetIt(getIt);

В папке lib у нас есть файл injection.dart предназначенный для инициализации пакета get_it. После этого мы можем запустить наш волшебный код для автоматического создания нашего файла.

Пакеты flutter pub run build_runner build — delete-conflicting-outputs
void main() {
  //configureDependencies() method is for the Dependenct Injection
  configureDependencies();
  runApp(const AppWidget());
}

В файле main.dart есть две функции: configureDependencies() и runApp(). Поскольку мы используем get_it и injectable пакеты для внедрения зависимостей, нам необходимо зарегистрировать наши зависимости перед запуском приложения.

@module
abstract class InjectableModule {
  @singleton
  AppRouter get appRouter => AppRouter();
}

Чтобы зарегистрировать наши сторонние пакеты, нам нужно пометить наш класс как тег @module. Поскольку используется пакет auto_router, мы добавляем его туда как Singleton. Нам нужно создать только один раз и с запущенным приложением. Из-за этого он не может быть lazySingleton. Вы можете найти этот файл в папке infrastructure/core.

Цель этого руководства - научить использованию уведомлений с помощью пакета awesome_notifications. Как правило, люди используют два типа уведомлений. Во-первых обычные уведомления похожи на немедленные уведомления, а следующие асинхронные уведомления. В этом уроке были созданы 2 события/функции.

@freezed
class NotificationEvent with _$NotificationEvent {
  const factory NotificationEvent.sendNormalNotification() =
      SendNormalNotification;
  const factory NotificationEvent.sendNotificationAfter3Seconds() =
      SendNotificationAfter3Seconds;
}

Здесь у нас есть два события. Первый из них предназначен для немедленного уведомления. Когда пользователю необходимо получить немедленное сообщение, вы можете использовать такое событие/функцию. Второе - это асинхронное уведомление, как я уже сказал. После. того, как мы нажмем на кнопку нам нужно будет подождать 3 секунды, чтобы получить уведомление.

class NotificationNotifier extends StateNotifier<NotificationState> {...}

Для нашего уведомления есть множество функций, которые вы можете увидеть. Я объяснил все функции, вы можете увидеть мои пояснения над функциями.

Для notification_state использовался файл dart, и более нигде. Итак, я создал пример состояния, которое является логическим значением полученного уведомления. 

Наконец, чтобы предоставить наш уведомитель, нам нужно создать новый StateNotifierProvider. Нам не нужно добавлять функцию autoDispose к нашему провайдеру. Чтобы использовать наш уведомитель, мы должны обернуть наше дерево виджетов с помощью Consumer. После этого мы можем связаться с ref и нотификатором нашего провайдера. 

return Consumer(
      builder: (context, ref, child) {
        return Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: [
              NotificationButton(
                buttonText: "Send Notification!",
                buttonBackgroundColor:
                    MaterialStateProperty.all(Colors.deepOrange),
                onPressed: () {
                  ref
                      .read(notificationProvider.notifier)
                      .mapEventsToState(const SendNormalNotification());
                },
              ),
              const SizedBox(height: 30),
              NotificationButton(
                buttonText: "Send Notification After 3 Seconds!",
                buttonBackgroundColor: MaterialStateProperty.all(Colors.indigo),
                onPressed: () {
                  ref
                      .read(notificationProvider.notifier)
                      .mapEventsToState(const SendNotificationAfter3Seconds());
                },
              ),
            ],
          ),
        );
      },
    );

Здесь мы можем получить доступ к нашим функциям через ref, и вы не должны забывать, что когда мы используем ref в аргументе onPressed, тогда мы должны использовать ref.read() вместо ref.watch(). Это очень важно когда используем Riverpod.

Маршрутизация

Ранее уже упоминалось о том, что пакет autoroute прост в использовании и мощный. Вам просто нужно настроить страницы и запустить метод builder, который я упомянул выше как «magical code».

@MaterialAutoRouter(
  replaceInRouteName: 'Page,Route',
  routes: <AutoRoute>[
    AutoRoute(page: NotificationPage, initial: true),
    AutoRoute(page: OrangePage),
    AutoRoute(page: PurplePage),
  ],
)
class $AppRouter {}

Вот, например, у нас есть три страницы, одна из них должна быть начальной страницей.

Вывод

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

Для неасинхронного уведомления у нас есть такие уведомления:

Наконец, для асинхронного уведомления, что мы видим:

#Flutter
Комментарии
Чтобы оставить комментарий, необходимо авторизоваться

Присоединяйся в тусовку

В подарок 100$ на счет при регистрации

Получить