当应用程序被杀死时,颤振本地通知不会重定向到相关屏幕

Posted

技术标签:

【中文标题】当应用程序被杀死时,颤振本地通知不会重定向到相关屏幕【英文标题】:Flutter local notifications doesn't redirect to relevant screen when app is killed 【发布时间】:2021-11-25 20:10:15 【问题描述】:

我在 Flutter 应用中使用 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.09.0.0 的两个版本上都试过这个。

【问题讨论】:

【参考方案1】:

没见过这个笔记:

注意:从插件的4.0版本开始,当应用程序通过点击通知触发时,调用initialize将不会触发onSelectNotification回调。如果您需要处理触发应用程序启动的通知,请使用插件中可用的 getNotificationAppLaunchDetails 方法,例如更改应用的主路由以进行深层链接。

基于notificationAppLaunchDetails 更改initialRoute 解决了它。

final NotificationAppLaunchDetails? notificationAppLaunchDetails =
      await flutterLocalNotificationsPlugin.getNotificationAppLaunchDetails();
  final didNotificationLaunchApp =
      notificationAppLaunchDetails?.didNotificationLaunchApp ?? false;
final initialRoute = didNotificationLaunchApp ? '/second' : '/first';

【讨论】:

以上是关于当应用程序被杀死时,颤振本地通知不会重定向到相关屏幕的主要内容,如果未能解决你的问题,请参考以下文章

当隔离被杀死时,颤振隔离内的计时器不会停止

使用firebase发送静默推送通知,以便在应用程序被杀死时唤醒它

点击推送通知不会重定向到特定页面

当应用程序被杀死时,无法在推送通知单击时导航到特定屏幕(Flutter android)

当应用程序不在前台时,特定活动不会从通知单击打开(应用程序是最近的,没有被杀死!)

当请求视频和音频通话时,我如何接收全屏通知,例如颤振中的 Facebook Messenger