Firebase 在颤振上单击背景通知时如何导航?

Firebase 在颤振上单击背景通知时如何导航?,firebase,flutter,dart,background,firebase-cloud-messaging,Firebase,Flutter,Dart,Background,Firebase Cloud Messaging,单击“FCM通知”时是否可以导航到指定路径 我创建了一个顶级函数并将其添加到导航器路径,但它不起作用,当单击后台通知时,它只会打开应用程序 我想我发现了一个问题 现在,我将fcm配置从home page更改为splash screen。 前台无法导航到页面,我认为这是因为启动屏幕不再可用。当我点击通知消息时,它只会打开应用程序 FCM配置 onBackgroundMessage: backgroundMessageHandler 顶级功能 Future<dynamic> backg

单击“FCM通知”时是否可以导航到指定路径

我创建了一个顶级函数并将其添加到导航器路径,但它不起作用,当单击后台通知时,它只会打开应用程序

我想我发现了一个问题

现在,我将
fcm
配置从
home page
更改为
splash screen
。 前台无法导航到页面,我认为这是因为启动屏幕不再可用。当我点击通知消息时,它只会打开应用程序

FCM配置

onBackgroundMessage: backgroundMessageHandler
顶级功能

Future<dynamic> backgroundMessageHandler(Map<String, dynamic> message) {
  if (message.containsKey('data')) {
    getIt<NavigationService>().navigateTo('/${message['data']['screen']}');
  }
}
main.dart

GetIt getIt = GetIt.instance;

void main() {
  setupLocator();
    runApp(MyApp());
}
材料PP

 return MaterialApp(
      navigatorKey: NavigationService().navigatorKey,
      onGenerateRoute: Router.generateRoute,
    );
导航服务设置定位器

class NavigationService {
  final GlobalKey<NavigatorState> navigatorKey =
      new GlobalKey<NavigatorState>();

  Future<dynamic> navigateTo(String routeName) {
    return navigatorKey.currentState.pushNamed(routeName);
  }
}

void setupLocator() {
  getIt.registerLazySingleton(() => NavigationService());
}
类导航服务{
最后的环球航空公司=
新GlobalKey();
未来导航到(字符串路由名称){
返回navigatorKey.currentState.pushNamed(routeName);
}
}
void setupLocator(){
getIt.registerLazySingleton(()=>NavigationService());
}
在那个示例中,我使用共享的首选项数据(如类id)来检查包含该类id的通知数据,然后它可以导航到特定屏幕

无效注册表通知(){
_firebaseMessaging.requestNotificationPermissions(
const IONotificationSettings(声音:真、徽章:真、警报:真),
);
_配置(onMessage:(映射消息){
打印('onMessage:$message');
//打印(消息['data']['classID']+“onMessage”);
if(SharedClassID.toString().包含(消息['data']['classID']))
{
Navigator.push(上下文、MaterialPage路由(生成器:
(上下文)=>BroadcastNotification());
印刷品(“发现”);
}
else if(SharedClassID.toString()包含(消息['data']['classID']))
{
push(context,MaterialPageRoute(builder:(context)=>MuseGalaryNew());
印刷品(“发现”);
}
其他的
{
打印(“未找到”);
}
返回;
},onResume:(映射消息){
if(SharedClassID.toString().包含(消息['data']['classID']))
{
push(context,MaterialPageRoute(builder:(context)=>BroadcastNotification());
印刷品(“发现”);
}
else if(SharedClassID.toString()包含(消息['data']['classID']))
{
push(context,MaterialPageRoute(builder:(context)=>StudentHomework());
印刷品(“发现”);
}
其他的
{
打印(“未找到”);
}
//打印(消息['data']['classID']+“onResume”);
打印('onResume:$message');
返回;
},onLaunch:(映射消息){
if(SharedClassID.toString().包含(消息['data']['classID']))
{
push(context,MaterialPageRoute(builder:(context)=>BroadcastNotification());
印刷品(“发现”);
}
else if(SharedClassID.toString()包含(消息['data']['classID']))
{
push(context,MaterialPageRoute(builder:(context)=>StudentHomework());
印刷品(“发现”);
}
其他的
{
打印(“未找到”);
}
返回;
});
}

我希望您已经配置了firebase\u消息规范所需的本机端声明

根据您提供的有效载荷:

有效载荷

const payload: admin.messaging.MessagingPayload = {
                notification:{
                    title: `New Enquiry`,
                    body:`${customerName} published to ${subName}`,
                    badge: '1',
                    sound: 'default'
                },
                data: {
                    click_action: `FLUTTER_NOTIFICATION_CLICK`,
                    sound: `default`,
                    status: `chat`,
                    screen: `homePage`
                  }
            }
const payload: admin.messaging.MessagingPayload = {
                notification:{
                    title: `New Enquiry`,
                    body:`${customerName} published to ${subName}`,
                    badge: '1',
                    sound: 'default'
                },
                data: {
                    click_action: `FLUTTER_NOTIFICATION_CLICK`,
                    sound: `default`,
                    status: `chat`,
                    screen: `homePage`
                  }
            }
你的简历是这样的,同样的,onLaunch也是这样

恢复时

onResume: (Map<String, dynamic> message) {
  if(SharedClassID.toString().contains(message['data']['classID']))
  {
   
    Navigator.push(context, MaterialPageRoute(builder: (context)=>BroadcastNotification()));
    print("found");
  }
  else if(SharedClassID.toString().contains(message['data']['classID']))
  {
 
    Navigator.push(context, MaterialPageRoute(builder: (context)=>StudentHomework()));
    print("found");
  }

  else
    {
      print("not found");
    }


  //print(message['data']['classID']+" onResume");
  print('onResume: $message');
  return;
}
如果要基于SharedClassId进行路由,则在有效负载和路由中传递classId。 示例代码段:

if(message['data']['classId'] == SharedClassId)
  {
    //TODO: route
  
  }else if(message['data']['classId'] == SharedClassId){
    //TODO: route
  }

通知有效载荷是否包含一个
点击操作
字段?@HasilT是的,我将有效载荷添加到了这里我也有同样的问题,而且我还没有找到解决方案。除了要打开的屏幕之外,需要知道在应用程序完全关闭的情况下,导航器如何打开屏幕,谢谢您您需要使用_firebaseMessaging.subscribeToTopic(“您的主题名称”)…在收到应用程序关闭的通知后订阅事件,当您单击通知时,它将重定向到该特定页面
if(message['data']['screen'] == 'homePage')
  {
    //TODO: route
  
  }else if(message['data']['screen'] == 'homeWorkPage'){
    //TODO: route
  }
if(message['data']['classId'] == SharedClassId)
  {
    //TODO: route
  
  }else if(message['data']['classId'] == SharedClassId){
    //TODO: route
  }