Android 如何使用FCM+从后台打开颤振应用程序;数据信息?

Android 如何使用FCM+从后台打开颤振应用程序;数据信息?,android,ios,flutter,flutter-layout,Android,Ios,Flutter,Flutter Layout,我已经在我的应用程序中实现了Google FCM,并成功地在所有4个消息处理程序(onMessage、onLaunch、onResume和onBackground)上接收消息。我的主要功能是导航到应用程序的特定屏幕。我使用Navigator状态键实现了这一功能,这对于除onBackground之外的4个处理程序中的3个处理程序非常有效。当我向我的应用程序发送数据消息时,onBackground会被触发,当它尝试导航到特定屏幕时,我会收到以下错误: I/flatter(17050):NoSuchM

我已经在我的应用程序中实现了Google FCM,并成功地在所有4个消息处理程序(onMessage、onLaunch、onResume和onBackground)上接收消息。我的主要功能是导航到应用程序的特定屏幕。我使用Navigator状态键实现了这一功能,这对于除onBackground之外的4个处理程序中的3个处理程序非常有效。当我向我的应用程序发送数据消息时,onBackground会被触发,当它尝试导航到特定屏幕时,我会收到以下错误:

I/flatter(17050):NoSuchMethodError:方法“push”在null上被调用

I/颤振(17050):接收器:空

I/flatter(17050):尝试调用:push(materialpage实例)


我的主要问题是,除了Navigator.of(context)或GlobalKey(Navigator-state)之外,还有其他方法可以导航到屏幕上吗即使在最小化应用程序后,应用程序的导航状态仍保留在哪里?

您只需在通知负载中添加一些变量,以确定您希望应用程序导航到的位置,并在您的onResumeonLaunch中进行如下检查

onResume: (Map<String, dynamic> message) async {

String type = message['data']['type'];

        if(type != null){
          if(type == 'chat'){
            Navigator.push(context, MaterialPageRoute(builder: (context)=> YourPageRoute()));

          }
     }
}




onLaunch: (Map<String, dynamic> message) async {

String type = message['data']['type'];

        if(type != null){
          if(type == 'chat'){
            Navigator.push(context, MaterialPageRoute(builder: (context)=> YourPageRoute()));
          }
    }
}
onResume:(映射消息)异步{
字符串类型=消息['data']['type'];
if(type!=null){
如果(类型==“聊天室”){
push(context,MaterialPageRoute(builder:(context)=>YourPageRoute());
}
}
}
onLaunch:(映射消息)异步{
字符串类型=消息['data']['type'];
if(type!=null){
如果(类型==“聊天室”){
push(context,MaterialPageRoute(builder:(context)=>YourPageRoute());
}
}
}

您只需在通知有效负载中加入一些变量,以确定您希望应用程序导航到的位置,并在您的onResumeonLaunch中进行如下检查

onResume: (Map<String, dynamic> message) async {

String type = message['data']['type'];

        if(type != null){
          if(type == 'chat'){
            Navigator.push(context, MaterialPageRoute(builder: (context)=> YourPageRoute()));

          }
     }
}




onLaunch: (Map<String, dynamic> message) async {

String type = message['data']['type'];

        if(type != null){
          if(type == 'chat'){
            Navigator.push(context, MaterialPageRoute(builder: (context)=> YourPageRoute()));
          }
    }
}
onResume:(映射消息)异步{
字符串类型=消息['data']['type'];
if(type!=null){
如果(类型==“聊天室”){
push(context,MaterialPageRoute(builder:(context)=>YourPageRoute());
}
}
}
onLaunch:(映射消息)异步{
字符串类型=消息['data']['type'];
if(type!=null){
如果(类型==“聊天室”){
push(context,MaterialPageRoute(builder:(context)=>YourPageRoute());
}
}
}

我知道这是一个迟到的回复,但根据Flatter文档,您只能执行HTTP请求和I/O操作(例如读取和写入数据库)。原因是onBackgroundMessage是一个独立的函数,这意味着您不能在类内调用函数和变量

我也被困在这个问题上,最近在文档中才发现

请注意,先阅读文档


我知道这是一个迟到的回复,但根据Flatter文档,您只能执行HTTP请求和I/O操作(例如,读取和写入数据库)。原因是onBackgroundMessage是一个独立的函数,这意味着您不能在类内调用函数和变量

我也被困在这个问题上,最近在文档中才发现

请注意,先阅读文档


您好,感谢您的快速回复,我的主要问题是“onBackgroundMessage”处理程序,如果我尝试从此处理程序导航,它会出现与我在问题中遇到的错误相同的错误(“push called on null”)。我可以从这里导航吗?示例:由VoIP应用程序实现的呼叫屏幕。我上面发布的答案在前台和后台都适用于FCM,我没有考虑其他情况,但在其他情况下可以自由选择其他答案。您好,感谢您的快速回复,我的主要问题是“onBackgroundMessage”处理程序,如果我尝试从这个处理程序导航,它会给出与我在问题中遇到的错误相同的错误(“push called on null”)。有什么方法可以从这里导航吗?示例:由VoIP应用程序实现的呼叫屏幕。我上面发布的答案在前台和后台都适用于FCM,我没有考虑其他情况,但在其他情况下可以自由选择其他答案。我明白了,目前唯一的解决办法是在Android中实现本机代码和服务,但这并不能达到目的。一种方法是使用远程通知通知我的应用程序进行更新,然后使用远程通知触发本地通知。实际上,您可以使用navigator push进行本地通知。我明白了,目前唯一的解决办法是在Android中实现本机代码和服务,但这与目的背道而驰。一种方法是使用远程通知通知我的应用程序进行更新,然后使用远程通知触发本地通知。实际上,您可以使用navigator push进行本地通知。