Flutter Flatter Firebase消息:在收到后台通知时打开新屏幕

Flutter Flatter Firebase消息:在收到后台通知时打开新屏幕,flutter,firebase-cloud-messaging,Flutter,Firebase Cloud Messaging,后台处理程序被调用,一切正常,但我不知道如何获取用于导航到新屏幕的BuildContext实例。我有这个处理程序 Future<void> firebaseMessagingBackgroundHandler(RemoteMessage message) async { var notificationData = message.data; var view = notificationData['view']; if(view == 'Messages

后台处理程序被调用,一切正常,但我不知道如何获取用于导航到新屏幕的BuildContext实例。我有这个处理程序


Future<void> firebaseMessagingBackgroundHandler(RemoteMessage message) async {
    var notificationData = message.data;
    var view = notificationData['view'];

    if(view == 'MessagesScreen') {
        Map<String, dynamic> videoData = json.decode(
            notificationData['video_data']);
        VideoItem videoItem = VideoItem.fromJson(videoData);

       Navigator.pushNamed(context, '/playerScreen', arguments:{videoItem});
    } else {
        view = '/$view';
        Navigator.pushNamed(context, view);
    }

    return Future<void>.value();
}
我正在使用Firebase消息:9.1.2

你知道如何做到这一点吗


Thx

这种行为不可能直接发生。backgrounder处理程序是作为一个新的隔离程序生成的,您不能在其中执行任何与UI相关的操作

您可以通过从UI线程侦听端口并从后台将数据发送到此端口来执行隔离通信

在UI线程上侦听:

  ReceivePort _port = ReceivePort();
     IsolateNameServer.registerPortWithName(
     _port.sendPort, 'port_name');
     _port.listen((dynamic data) {
        /// navigate here
     }
发送消息,位于backgroundHandler内部:

final SendPort send =
  IsolateNameServer.lookupPortByName('port_name');
 send.send(true);

如果要在应用程序终止时用户点击通知时导航,请尝试以下操作:

FirebaseMessaging.instance
    .getInitialMessage()
    .then((RemoteMessage? message) {
  if (message == null) return;

  var notificationData = message.data;
  var view = notificationData['view'];

  if(view == 'MessagesScreen') {
      Map<String, dynamic> videoData = json.decode(
          notificationData['video_data']);
      VideoItem videoItem = VideoItem.fromJson(videoData);

    Navigator.pushNamed(context, '/playerScreen', arguments:{videoItem});
  } else {
      view = '/$view';
      Navigator.pushNamed(context, view);
  }
  
});
FirebaseMessaging.instance
.getInitialMessage()
.然后((远程消息?消息){
if(message==null)返回;
var notificationData=message.data;
var view=通知数据['view'];
如果(视图=='MessagesScreen'){
Map videoData=json.decode(
通知数据[“视频数据]);
VideoItem VideoItem=VideoItem.fromJson(videoData);
pushNamed(上下文“/playerScreen”,参数:{videoItem});
}否则{
视图='/$view';
pushNamed(上下文、视图);
}
});

检查此示例:

谢谢,效果很好:)
FirebaseMessaging.instance
    .getInitialMessage()
    .then((RemoteMessage? message) {
  if (message == null) return;

  var notificationData = message.data;
  var view = notificationData['view'];

  if(view == 'MessagesScreen') {
      Map<String, dynamic> videoData = json.decode(
          notificationData['video_data']);
      VideoItem videoItem = VideoItem.fromJson(videoData);

    Navigator.pushNamed(context, '/playerScreen', arguments:{videoItem});
  } else {
      view = '/$view';
      Navigator.pushNamed(context, view);
  }
  
});