Flutter Flatter Firebase消息:在收到后台通知时打开新屏幕
后台处理程序被调用,一切正常,但我不知道如何获取用于导航到新屏幕的BuildContext实例。我有这个处理程序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
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);
}
});