如何在Flutter中使用本地通知打开某个页面? (不是 FCM)
how to open a certain page using local notification in Flutter? (Not FCM)
不,我不是在这里询问 Firebase 云消息通知,而是纯粹使用来自这里的本地通知包 flutter local notification
我希望如果我的用户单击该通知,它就会被定向到某个页面。怎么做?
目前我的代码是这样的
class LocalNotificationService {
late FlutterLocalNotificationsPlugin _flutterLocalNotificationsPlugin;
LocalNotificationService._privateConstructor() {
_init();
}
static final LocalNotificationService _instance = LocalNotificationService._privateConstructor();
static LocalNotificationService get instance => _instance; // singleton access
void _init() {
_flutterLocalNotificationsPlugin = FlutterLocalNotificationsPlugin();
_initializePlatformSpecifics();
}
Future<void> _initializePlatformSpecifics() async {
var androidInitializationSettings = AndroidInitializationSettings("app_notification_icon");
var iOSInitializationSettings = IOSInitializationSettings(
requestAlertPermission: true,
requestBadgePermission: true,
requestSoundPermission: true,
onDidReceiveLocalNotification: (id, title, body, payload) async {
// do something if notification is clicked
},
);
final initializationSettings = InitializationSettings(
android: androidInitializationSettings,
iOS: iOSInitializationSettings,
);
await _flutterLocalNotificationsPlugin.initialize(initializationSettings);
}
void showSimpleNotification({
required String title,
required String body,
required NotificationType notificationType,
}) async {
var android = _setAndroidNotificationDetails(notificationType);
var ios = IOSNotificationDetails();
var notificationDetails = new NotificationDetails(android: android, iOS: ios);
await _flutterLocalNotificationsPlugin.show(
1, // only need to show one notification in the notification tray, so it is ok if we use the Notification ID
title,
body,
notificationDetails,
);
}
}
我建议阅读插件文档
根据文档
FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin =
FlutterLocalNotificationsPlugin();
const AndroidInitializationSettings initializationSettingsAndroid =
AndroidInitializationSettings('app_icon');
final IOSInitializationSettings initializationSettingsIOS =
IOSInitializationSettings(
requestSoundPermission: false,
requestBadgePermission: false,
requestAlertPermission: false,
onDidReceiveLocalNotification: onDidReceiveLocalNotification,
);
final MacOSInitializationSettings initializationSettingsMacOS =
MacOSInitializationSettings(
requestAlertPermission: false,
requestBadgePermission: false,
requestSoundPermission: false);
final InitializationSettings initializationSettings = InitializationSettings(
android: initializationSettingsAndroid,
iOS: initializationSettingsIOS,
macOS: initializationSettingsMacOS);
await flutterLocalNotificationsPlugin.initialize(initializationSettings,
onSelectNotification: onSelectNotification);
您可以传递 onSelectNotification 函数,只要用户点击通知就会调用该函数
从这个函数你可以重定向到特定的屏幕示例,如下所示
Future selectNotification(String payload) async {
if (payload != null) {
debugPrint('notification payload: $payload');
}
await Navigator.push(
context,
MaterialPageRoute<void>(builder: (context) =>
SecondScreen(payload)),);
}
首先您需要创建一个 GlobalKey
导航,如下所示:
GlobalKey<NavigatorState> navigatorKey = GlobalKey<NavigatorState>();
并在 MaterialApp
内,将 navigatorKey 属性 设置为我们创建的键,如下所示 属性
navigatorKey: navigatorKey
现在您可以使用当前键状态内的导航方法,例如:
navigatorKey.currentState!.push()
不,我不是在这里询问 Firebase 云消息通知,而是纯粹使用来自这里的本地通知包 flutter local notification
我希望如果我的用户单击该通知,它就会被定向到某个页面。怎么做?
目前我的代码是这样的
class LocalNotificationService {
late FlutterLocalNotificationsPlugin _flutterLocalNotificationsPlugin;
LocalNotificationService._privateConstructor() {
_init();
}
static final LocalNotificationService _instance = LocalNotificationService._privateConstructor();
static LocalNotificationService get instance => _instance; // singleton access
void _init() {
_flutterLocalNotificationsPlugin = FlutterLocalNotificationsPlugin();
_initializePlatformSpecifics();
}
Future<void> _initializePlatformSpecifics() async {
var androidInitializationSettings = AndroidInitializationSettings("app_notification_icon");
var iOSInitializationSettings = IOSInitializationSettings(
requestAlertPermission: true,
requestBadgePermission: true,
requestSoundPermission: true,
onDidReceiveLocalNotification: (id, title, body, payload) async {
// do something if notification is clicked
},
);
final initializationSettings = InitializationSettings(
android: androidInitializationSettings,
iOS: iOSInitializationSettings,
);
await _flutterLocalNotificationsPlugin.initialize(initializationSettings);
}
void showSimpleNotification({
required String title,
required String body,
required NotificationType notificationType,
}) async {
var android = _setAndroidNotificationDetails(notificationType);
var ios = IOSNotificationDetails();
var notificationDetails = new NotificationDetails(android: android, iOS: ios);
await _flutterLocalNotificationsPlugin.show(
1, // only need to show one notification in the notification tray, so it is ok if we use the Notification ID
title,
body,
notificationDetails,
);
}
}
我建议阅读插件文档
根据文档
FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin =
FlutterLocalNotificationsPlugin();
const AndroidInitializationSettings initializationSettingsAndroid =
AndroidInitializationSettings('app_icon');
final IOSInitializationSettings initializationSettingsIOS =
IOSInitializationSettings(
requestSoundPermission: false,
requestBadgePermission: false,
requestAlertPermission: false,
onDidReceiveLocalNotification: onDidReceiveLocalNotification,
);
final MacOSInitializationSettings initializationSettingsMacOS =
MacOSInitializationSettings(
requestAlertPermission: false,
requestBadgePermission: false,
requestSoundPermission: false);
final InitializationSettings initializationSettings = InitializationSettings(
android: initializationSettingsAndroid,
iOS: initializationSettingsIOS,
macOS: initializationSettingsMacOS);
await flutterLocalNotificationsPlugin.initialize(initializationSettings,
onSelectNotification: onSelectNotification);
您可以传递 onSelectNotification 函数,只要用户点击通知就会调用该函数
从这个函数你可以重定向到特定的屏幕示例,如下所示
Future selectNotification(String payload) async { if (payload != null) { debugPrint('notification payload: $payload'); } await Navigator.push( context, MaterialPageRoute<void>(builder: (context) => SecondScreen(payload)),); }
首先您需要创建一个 GlobalKey
导航,如下所示:
GlobalKey<NavigatorState> navigatorKey = GlobalKey<NavigatorState>();
并在 MaterialApp
内,将 navigatorKey 属性 设置为我们创建的键,如下所示 属性
navigatorKey: navigatorKey
现在您可以使用当前键状态内的导航方法,例如:
navigatorKey.currentState!.push()