Flutter开发中,本地通知一般会用到flutter_local_notifications,它是Flutter官方推荐的本地通知插件,Dart pub生态最主流的本地推送库。不需要后端服务器、不需要网络,通知全部在手机设备本地完成调度、弹出。简单总结如下:
API:
initialize(xxx):初始化通知插件,配置 Android/iOS 基础参数。
InitializationSettings:分别包装 Android、iOS 初始化配置
AndroidInitializationSettings(String icon):Android 通知图标,传入drawable资源名
DarwinInitializationSettings:iOS 配置,权限、通知展示选项
resolvePlatformSpecificImplementation<T>():获取Android平台独有的API实现。iOS返回null。
作用:
1.在手机状态栏弹出系统通知(弹窗、状态栏图标、铃声、震动)
2.定时本地提醒:指定未来某个时间弹出通知(闹钟、待办提醒)
3.监听通知点击事件,携带自定义参数 payload,跳转页面
4.支持 Android、iOS双平台;封装了两个平台原生通知API,不用写Android/iOS 原生代码。
栗子:
Dart
flutter_local_notifications: ^17.0.0
Dart
import 'package:flutter/material.dart';
import 'package:flutter_local_notifications/flutter_local_notifications.dart';
void main() async {
WidgetsFlutterBinding.ensureInitialized();
await NotificationHelper.init();
runApp(const MyApp());
}
class NotificationHelper {
static final FlutterLocalNotificationsPlugin _plugin =
FlutterLocalNotificationsPlugin();
static Future<void> init() async {
const AndroidInitializationSettings androidSettings =
AndroidInitializationSettings('ic_notification'); // drawable下图标名称
const DarwinInitializationSettings iosSettings = DarwinInitializationSettings();
const InitializationSettings initSettings = InitializationSettings(
android: androidSettings,
iOS: iosSettings,
);
await _plugin.initialize(initSettings);
await _plugin.resolvePlatformSpecificImplementation<
AndroidFlutterLocalNotificationsPlugin>()
?.requestNotificationsPermission();
}
static Future<void> showSimpleNotification() async {
const AndroidNotificationDetails androidDetail =
AndroidNotificationDetails(
"default_channel_id",
"普通通知",
channelDescription: "普通本地通知通道",
importance: Importance.high,
priority: Priority.high,
);
const NotificationDetails notificationDetail = NotificationDetails(
android: androidDetail,
iOS: DarwinNotificationDetails(),
);
await _plugin.show(
1001,
"本地通知标题",
"这是一条即时弹出的本地通知消息",
notificationDetail,
);
}
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(title: const Text("Demo1 立即通知")),
body: Center(
child: ElevatedButton(
onPressed: NotificationHelper.showSimpleNotification,
child: const Text("点击弹出本地通知"),
),
),
),
);
}
}
注意:
1 zonedSchedule+androidAllowWhileIdle:true 需要精确闹钟权限,Android12+用户必须手动开启,否则抛exact_alarms_not_permitted。
2 zonedSchedule必须TZDateTime,普通DateTime不能直接传入,需要timezone并且初始化。
3 Android通知图标必须是drawable目录