Flutter 通知系统模块设计:Timecop从事件到系统通知的完整链路
在多平台 Flutter 应用中,通知功能是一个横跨 UI、业务逻辑与系统接口的复杂模块。本篇通过 4 个文件(notifications_event.dart、notifications_state.dart、notifications_bloc.dart、notifications_provider.dart),展示如何用 BLoC 模式 + flutter_local_notificatio
🌱 模块总览
| 文件 | 角色 | 主要职责 |
|---|---|---|
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 的「控制中枢」:
-
监听
NotificationsEvent; -
调用
NotificationsProvider执行平台逻辑; -
发出
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 | ✅ | 部分可模拟 |
更多推荐

所有评论(0)