🌱 模块总览

文件 角色 主要职责
notifications_event.dart 输入层 定义事件类型(用户意图)
notifications_bloc.dart 逻辑层 调度事件与状态,桥接 Provider
notifications_state.dart 状态层 表示通知当前状态
notifications_provider.dart 基础设施层 直接操作系统通知 API

这一组合实现了从 “触发事件 → 处理逻辑 → 执行系统通知 → 发出状态信号” 的完整链路。


🧩 一、Event:定义行为(输入层)

abstract class NotificationsEvent extends Equatable {
  const NotificationsEvent();
}

class RequestNotificationPermissions extends NotificationsEvent {
  const RequestNotificationPermissions();
  @override List<Object> get props => [];
}

class ShowNotification extends NotificationsEvent {
  final String? title;
  final String? body;
  const ShowNotification({this.title, this.body});
  @override List<Object?> get props => [title, body];
}

class RemoveNotifications extends NotificationsEvent {
  const RemoveNotifications();
  @override List<Object> get props => [];
}

💡 逻辑解读

  • NotificationsEvent 是所有事件的抽象基类。

  • 每个子类代表一个动作,例如:

    • RequestNotificationPermissions → 申请权限;

    • ShowNotification → 显示通知;

    • RemoveNotifications → 清除通知。

  • 事件是「无逻辑的意图」,由 Bloc 捕获后执行。


⚙️ 二、State:定义状态(输出层)

class NotificationsState extends Equatable {
  const NotificationsState();
  @override
  List<Object> get props => [];
}

💡 逻辑解读

  • 当前模块使用最简状态,仅表示“操作已完成”;

  • 后期可拓展为:

    final bool permissionGranted;
    final String? lastError;
    
  • Equatable 让状态对象按值比较,避免 UI 无意义刷新。


🧠 三、Bloc:编排逻辑(中间调度层)

class NotificationsBloc extends Bloc<NotificationsEvent, NotificationsState> {
  final NotificationsProvider notifications;

  NotificationsBloc(this.notifications) : super(const NotificationsState()) {
    on<RequestNotificationPermissions>((event, emit) async {
      await notifications.requestPermissions();
      emit(const NotificationsState());
    });

    on<ShowNotification>((event, emit) async {
      await notifications.displayRunningTimersNotification(event.title, event.body);
      emit(const NotificationsState());
    });

    on<RemoveNotifications>((event, emit) async {
      await notifications.removeAllNotifications();
      emit(const NotificationsState());
    });
  }
}

💡 逻辑解读

Bloc 是连接 UI 和底层 Provider 的「控制中枢」:

  1. 监听 NotificationsEvent

  2. 调用 NotificationsProvider 执行平台逻辑;

  3. 发出 NotificationsState 通知 UI 更新。

执行链路
UI add(ShowNotification)
        ↓
Bloc 调用 Provider.displayRunningTimersNotification()
        ↓
系统展示通知
        ↓
Bloc emit(NotificationsState())
        ↓
UI BlocBuilder 监听到状态更新

🔧 四、Provider:执行平台逻辑(基础设施层)

notifications_provider.dart 是整个通知系统的「底层引擎」,负责与 Flutter 插件通信。

class NotificationsProvider {
  final FlutterLocalNotificationsPlugin _notif;
  NotificationsProvider(this._notif);

  // 初始化跨平台通知引擎
  static Future<NotificationsProvider> load() async {
    final notif = FlutterLocalNotificationsPlugin();
    const initAndroid = AndroidInitializationSettings('ic_notification_icon');
    const initDarwin = DarwinInitializationSettings(
      requestSoundPermission: false,
      requestBadgePermission: false,
      requestAlertPermission: false,
    );
    const initLinux = LinuxInitializationSettings(defaultActionName: "Open Time Cop");
    const settings = InitializationSettings(
      android: initAndroid, iOS: initDarwin, macOS: initDarwin, linux: initLinux);
    await notif.initialize(settings);
    return NotificationsProvider(notif);
  }

  // 请求权限
  Future<bool> requestPermissions() async { ... }

  // 显示通知
  Future<void> displayRunningTimersNotification(String? title, String? body) async { ... }

  // 清除通知
  Future<void> removeAllNotifications() async => _notif.cancelAll();
}

💡 逻辑解读

  • 封装插件 flutter_local_notifications:统一四端(Android/iOS/macOS/Linux)初始化;

  • 职责单一:只负责执行,不参与业务逻辑;

  • 灵活扩展:未来可加入定时通知、渠道分级、前台服务常驻通知等功能。


🔄 五、模块调用顺序与依赖关系

层级 文件 调用方向
UI 层 BlocBuilder / BlocProvider 调用 → Bloc
Bloc 层 notifications_bloc.dart 监听 Event → 调用 Provider
Provider 层 notifications_provider.dart 执行平台 API
State 层 notifications_state.dart 发射新状态 → 通知 UI

完整调用链

UI 操作 → add(Event)
       ↓
NotificationsBloc 处理
       ↓
调用 NotificationsProvider 执行系统通知
       ↓
emit(NotificationsState)
       ↓
UI BlocBuilder 响应状态刷新

🧾 六、整体总结

这四个文件组合形成一个清晰、可维护的 Flutter 通知系统:

模块 职责 是否包含平台代码 是否可测试
NotificationsEvent 描述动作意图
NotificationsBloc 控制逻辑与调度
NotificationsState 表达当前状态
NotificationsProvider 实际执行通知 API 部分可模拟

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐