我正在使用flutter_local_notifications在一个颤振应用程序,以安排通知在特定的时间。
当我单击通知时,当应用程序运行时,它会按照预期的方式工作,并显示到相应的屏幕上;但是,当应用程序被杀死时单击通知时,它会转移到主屏幕。
由于此通知是自动调度的,而不是在用户操作上进行的,所以我是在一个函数而不是一个小部件中进行的。所以,我没有context。为了解决这个问题,我使用了GlobalKey类型的NavigatorState。
final GlobalKey<NavigatorState> navigatorKey = GlobalKey<NavigatorState>();
navigatorKey.currentState?.push(MaterialPageRoute(builder: (ctx) {
return Scaffold(
appBar: AppBar(
title: Text('notification clicked'),
),
);
}));我尝试的第二个方法是使用有状态小部件
class Noti extends StatefulWidget {
const Noti({Key? key}) : super(key: key);
@override
NotiState createState() => NotiState();
}
class NotiState extends State<Noti> {
@override
void initState() {
super.initState();
initNotification();
}
Future initNotification() async {
const AndroidInitializationSettings initializationSettingsAndroid =
AndroidInitializationSettings('bolt');
final InitializationSettings initializationSettings =
InitializationSettings(android: initializationSettingsAndroid);
flutterLocalNotificationsPlugin.initialize(
initializationSettings,
onSelectNotification: selectNotification,
);
const notDetails = NotificationDetails(
android: AndroidNotificationDetails('1', 'Scheduled Review',
channelDescription: 'Review reminders at scheduled time'));
flutterLocalNotificationsPlugin.periodicallyShow(1, 'Scheduled Review',
'Every Minute', RepeatInterval.everyMinute, notDetails);
}
Future selectNotification(String? payload) async {
Navigator.push(context, MaterialPageRoute(builder: ((ctx) {
return Scaffold(
appBar: AppBar(
title: Text('notification clicked'),
),
);
})));
}
@override
Widget build(BuildContext context) {
return Container();
}
}我在主页中随机插入的这个Noti小部件,以便调用它的initState。
同样的事情也发生在这里;也就是说,在应用程序死后单击通知时,我会被重定向到主屏幕,而不是一个标题为notification clicked的屏幕,这是这里的逻辑。但是,当应用程序处于活动状态时,它可以正常工作。我在上述库的8.2.0和9.0.0两种版本上都尝试过这一点。
发布于 2021-10-05 21:09:23
没有见过这张纸条:
注意:从插件的4.0版本开始,调用初始化将不会通过点击要触发的通知来触发应用程序启动时的onSelectNotification回调。使用插件中可用的getNotificationAppLaunchDetails方法,如果需要处理通知,触发应用程序的启动,例如更改应用程序的主路径以进行深度链接。
基于initialRoute的notificationAppLaunchDetails改造解决了这一问题。
final NotificationAppLaunchDetails? notificationAppLaunchDetails =
await flutterLocalNotificationsPlugin.getNotificationAppLaunchDetails();
final didNotificationLaunchApp =
notificationAppLaunchDetails?.didNotificationLaunchApp ?? false;
final initialRoute = didNotificationLaunchApp ? '/second' : '/first';https://stackoverflow.com/questions/69452276
复制相似问题