做網(wǎng)站銷售 優(yōu)幫云不受國(guó)內(nèi)限制的瀏覽器
前言
注: 剛開始學(xué)習(xí),如果某些案例使用時(shí)遇到問題,可以自行百度、查看官方案例、官方github。
簡(jiǎn)介
Flutter Local Notifications是一個(gè)用于在Flutter應(yīng)用程序中顯示本地通知的插件。它提供了一個(gè)簡(jiǎn)單而強(qiáng)大的方法來在設(shè)備上發(fā)送通知,以便用戶可以在應(yīng)用程序處于后臺(tái)或設(shè)備鎖定狀態(tài)下接收到它們。
使用Flutter Local Notifications插件,可以創(chuàng)建和安排各種類型的通知,包括:
- 即時(shí)通知:立即顯示的通知,用于向用戶傳達(dá)重要消息或提醒。
- 周期性通知:可以按照指定的時(shí)間間隔重復(fù)顯示的通知,例如每天或每周的提醒。
- 定時(shí)通知:在特定日期和時(shí)間觸發(fā)的通知,用于安排未來事件或提醒。
通過使用Flutter Local Notifications,可以自定義通知的外觀和行為,包括標(biāo)題,內(nèi)容,圖標(biāo),聲音,振動(dòng)模式和點(diǎn)擊操作。此外,還可以處理用戶與通知的交互,例如當(dāng)用戶點(diǎn)擊通知時(shí)執(zhí)行特定的操作。
Flutter Local Notifications插件使用簡(jiǎn)單且易于集成到Flutter項(xiàng)目中。它提供了一組易于使用的API,可以輕松創(chuàng)建和管理通知。此外,它還兼容Android和iOS平臺(tái),并且可以在兩個(gè)平臺(tái)上以相同的代碼庫進(jìn)行操作。
官方地址
https://pub-web.flutter-io.cn/packages/flutter_local_notifications
備注: 這里只學(xué)習(xí)關(guān)于安卓的基本使用
學(xué)習(xí)
準(zhǔn)備
安裝
flutter pub add flutter_local_notifications
即時(shí)通知
通知輔助類
NotificationHelper
// 導(dǎo)入包
import 'package:flutter_local_notifications/flutter_local_notifications.dart';class NotificationHelper {// 使用單例模式進(jìn)行初始化static final NotificationHelper _instance = NotificationHelper._internal();factory NotificationHelper() => _instance;NotificationHelper._internal();// FlutterLocalNotificationsPlugin是一個(gè)用于處理本地通知的插件,它提供了在Flutter應(yīng)用程序中發(fā)送和接收本地通知的功能。final FlutterLocalNotificationsPlugin _notificationsPlugin =FlutterLocalNotificationsPlugin();// 初始化函數(shù)Future<void> initialize() async {// AndroidInitializationSettings是一個(gè)用于設(shè)置Android上的本地通知初始化的類// 使用了app_icon作為參數(shù),這意味著在Android上,應(yīng)用程序的圖標(biāo)將被用作本地通知的圖標(biāo)。const AndroidInitializationSettings initializationSettingsAndroid =AndroidInitializationSettings('@mipmap/ic_launcher');// 15.1是DarwinInitializationSettings,舊版本好像是IOSInitializationSettings(有些例子中就是這個(gè))const DarwinInitializationSettings initializationSettingsIOS =DarwinInitializationSettings();// 初始化const InitializationSettings initializationSettings =InitializationSettings(android: initializationSettingsAndroid,iOS: initializationSettingsIOS);await _notificationsPlugin.initialize(initializationSettings);}// 顯示通知Future<void> showNotification({required String title, required String body}) async {// 安卓的通知// 'your channel id':用于指定通知通道的ID。// 'your channel name':用于指定通知通道的名稱。// 'your channel description':用于指定通知通道的描述。// Importance.max:用于指定通知的重要性,設(shè)置為最高級(jí)別。// Priority.high:用于指定通知的優(yōu)先級(jí),設(shè)置為高優(yōu)先級(jí)。// 'ticker':用于指定通知的提示文本,即通知出現(xiàn)在通知中心的文本內(nèi)容。const AndroidNotificationDetails androidNotificationDetails =AndroidNotificationDetails('your.channel.id', 'your channel name',channelDescription: 'your channel description',importance: Importance.max,priority: Priority.high,ticker: 'ticker');// ios的通知const String darwinNotificationCategoryPlain = 'plainCategory';const DarwinNotificationDetails iosNotificationDetails =DarwinNotificationDetails(categoryIdentifier: darwinNotificationCategoryPlain, // 通知分類);// 創(chuàng)建跨平臺(tái)通知const NotificationDetails platformChannelSpecifics =NotificationDetails(android: androidNotificationDetails,iOS: iosNotificationDetails);// 發(fā)起一個(gè)通知await _notificationsPlugin.show(1,title,body,platformChannelSpecifics,);}
}
使用
main() async {//用于確保Flutter的Widgets綁定已經(jīng)初始化。WidgetsFlutterBinding.ensureInitialized();// 初始化通知幫助類NotificationHelper notificationHelper = NotificationHelper();await notificationHelper.initialize();runApp(const MyApp());
}
class SwitcherContainerState extends State<SwitcherContainer> {final NotificationHelper _notificationHelper = NotificationHelper();Widget build(BuildContext context) {return Center(child: ElevatedButton(onPressed: () {_notificationHelper.showNotification(title: 'Hello',body: 'This is a notification!',);},child: const Text("發(fā)起通知")));}
}
注意:
- 一定要在main函數(shù)里進(jìn)行初始化,不然會(huì)報(bào)下面這個(gè)錯(cuò)誤(百度了半天,最后發(fā)現(xiàn)是自己忘記了初始化)
- 要開啟應(yīng)用的通知權(quán)限,不然可能無法通知
周期性通知
// 周期性通知Future<void> scheduleNotification({required int id,required String title,required String body,}) async {const AndroidNotificationDetails androidNotificationDetails =AndroidNotificationDetails('your.channel.id', 'your channel name',channelDescription: 'your channel description',importance: Importance.max,priority: Priority.high,ticker: 'ticker');// ios的通知const String darwinNotificationCategoryPlain = 'plainCategory';const DarwinNotificationDetails iosNotificationDetails =DarwinNotificationDetails(categoryIdentifier: darwinNotificationCategoryPlain, // 通知分類);// 創(chuàng)建跨平臺(tái)通知const NotificationDetails platformChannelSpecifics = NotificationDetails(android: androidNotificationDetails, iOS: iosNotificationDetails);
// 發(fā)起通知await _notificationsPlugin.periodicallyShow(id, title, body, RepeatInterval.everyMinute, platformChannelSpecifics);}
}
這里我設(shè)置的是每分鐘通知一次,注意:假如你在10:01發(fā)起了通知,10:01不會(huì)有通知消息,而是從10:02開發(fā)每隔一分鐘發(fā)起一次通知。
定時(shí)通知
// 定時(shí)通知
Future<void> zonedScheduleNotification({required int id,required String title,required String body,required DateTime scheduledDateTime}) async {const AndroidNotificationDetails androidNotificationDetails =AndroidNotificationDetails('your.channel.id', 'your channel name',channelDescription: 'your channel description',importance: Importance.max,priority: Priority.high,ticker: 'ticker');// ios的通知const String darwinNotificationCategoryPlain = 'plainCategory';const DarwinNotificationDetails iosNotificationDetails =DarwinNotificationDetails(categoryIdentifier: darwinNotificationCategoryPlain, // 通知分類);// 創(chuàng)建跨平臺(tái)通知const NotificationDetails platformChannelSpecifics = NotificationDetails(android: androidNotificationDetails, iOS: iosNotificationDetails);// 發(fā)起通知await _notificationsPlugin.zonedSchedule(id, title, body,tz.TZDateTime.from(scheduledDateTime, tz.local), // 使用本地時(shí)區(qū)的時(shí)間platformChannelSpecifics,uiLocalNotificationDateInterpretation:UILocalNotificationDateInterpretation.absoluteTime, // 設(shè)置通知的觸發(fā)時(shí)間是覺得時(shí)間);
}
注意:如下圖參數(shù)scheduledDate
是TZDateTime
類型,看了一下官方示例,還需要下載timezone
庫。
timezone
是一個(gè)用來處理時(shí)區(qū)信息的,可以使得在不同平臺(tái)上創(chuàng)建和處理日期時(shí)間對(duì)象更加方便和準(zhǔn)確。
官方地址
https://pub-web.flutter-io.cn/packages/timezone
安裝
flutter pub add timezone
初始化
就在通知輔助類NotificationHelper
的initialize
函數(shù)里初始化一下就行
import 'package:timezone/timezone.dart' as tz;
import 'package:timezone/data/latest.dart' as tz;// 初始化tz
tz.initializeTimeZones();
其他
除了上面三種外還有其他的通知形式,比如(以下內(nèi)容沒有測(cè)試)
長(zhǎng)文本
final androidPlatformChannelSpecifics = AndroidNotificationDetails('channel_id','channel_name','channel_description',styleInformation: BigTextStyleInformation('大文本內(nèi)容'),
);
大圖片
final androidPlatformChannelSpecifics = AndroidNotificationDetails('channel_id','channel_name','channel_description',styleInformation: BigPictureStyleInformation(FilePathAndroidBitmap('圖片路徑'),largeIcon: FilePathAndroidBitmap('大圖標(biāo)路徑'),),
);
還有一些比如媒體樣式、帶進(jìn)度條的等都可以在AndroidNotificationDetails
找到相應(yīng)的參數(shù)。
對(duì)于IOS來說,通知樣式收到蘋果的限制,可以通過DarwinNotificationDetails
的attachments
參數(shù)來實(shí)現(xiàn)一些簡(jiǎn)單操作。