Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从不调用Firebase消息onResume、onLaunch或onBackgroundMessage_Firebase_Flutter_Notifications_Firebase Cloud Messaging - Fatal编程技术网

从不调用Firebase消息onResume、onLaunch或onBackgroundMessage

从不调用Firebase消息onResume、onLaunch或onBackgroundMessage,firebase,flutter,notifications,firebase-cloud-messaging,Firebase,Flutter,Notifications,Firebase Cloud Messaging,我正在使用Firebase云消息包进行flifter。 我希望,每当用户点击收到的通知时,颤振应用程序就会打开,并根据fcm发送的数据导航到特定屏幕 但当应用程序处于后台或应用程序关闭时,我无法实现所需的行为,因为onResume和onLaunch处理程序从未被调用。我尝试了很多解决方案,比如创建通知通道,使用类似 颤振、本地通知等,但对我来说没有任何效果 下面是我的FirebaseMessagingService类,用于处理fcm相关任务 class FirebaseMessagingServ

我正在使用Firebase云消息包进行flifter。 我希望,每当用户点击收到的通知时,颤振应用程序就会打开,并根据fcm发送的数据导航到特定屏幕

但当应用程序处于后台或应用程序关闭时,我无法实现所需的行为,因为onResume和onLaunch处理程序从未被调用。我尝试了很多解决方案,比如创建通知通道,使用类似 颤振、本地通知等,但对我来说没有任何效果

下面是我的FirebaseMessagingService类,用于处理fcm相关任务

class FirebaseMessagingService {
  final FirebaseMessaging _fcm = FirebaseMessaging();
  final RouterService _routerService = locator<RouterService>();
  final LocalStorageService _localStorage = locator<LocalStorageService>();
  Future initialise() async {
    if (Platform.isIOS) {
      _fcm.requestNotificationPermissions(IosNotificationSettings());
    }
    _fcm.configure(
        onMessage: (Map<String, dynamic> message) async {
          Map<String, dynamic> arguments = {};

          Map<String, dynamic> data = message['data'];
          if (data.containsKey('argument')) {
            if (data.containsKey('value')) {
              arguments[data['argument']] = data['value'];
            }
          }
          _routerService.navigationKey.currentState
              .pushReplacementNamed('${data['route']}', arguments: arguments);
        },
        onLaunch: (Map<String, dynamic> message) async {
          Map<String, dynamic> arguments = {};
          Map<String, dynamic> data = message['data'];
          if (data.containsKey('argument')) {
            if (data.containsKey('value')) {
              arguments[data['argument']] = data['value'];
            }
          }
          _routerService.navigationKey.currentState
              .pushReplacementNamed('${data['route']}', arguments: arguments);
        },
        onResume: (Map<String, dynamic> message) async {
          Map<String, dynamic> arguments = {};

          Map<String, dynamic> data = message['data'];
          if (data.containsKey('argument')) {
            if (data.containsKey('value')) {
              arguments[data['argument']] = data['value'];
            }
          }
          _routerService.navigationKey.currentState
              .pushReplacementNamed('${data['route']}', arguments: arguments);
        },
        onBackgroundMessage: _myBackgroundMessageHandler);
  }

  static Future<dynamic> _myBackgroundMessageHandler(
      Map<String, dynamic> message) async {
    final RouterService _routerService = locator<RouterService>();
    if (message.containsKey('data')) {
      // Handle data message
      Map<String, dynamic> arguments = {};
      Map<String, dynamic> data = message['data'];
      if (data.containsKey('argument')) {
        if (data.containsKey('value')) {
          arguments[data['argument']] = data['value'];
        }
      }
      _routerService.navigationKey.currentState
          .pushReplacementNamed('${data['route']}', arguments: arguments);
    }

    if (message.containsKey('notification')) {
      // Handle notification message
      final dynamic notification = message['notification'];
    }
  }
}
类FirebaseMessagingService{
最终FirebaseMessaging_fcm=FirebaseMessaging();
最终RouterService_RouterService=locator();
最终LocalStorageService_localStorage=locator();
Future initialise()异步{
if(Platform.isIOS){
_fcm.requestNotificationPermissions(IONotificationSettings());
}
_fcm.configure(
onMessage:(映射消息)异步{
映射参数={};
地图数据=消息['data'];
if(data.containsKey('argument')){
if(data.containsKey('value')){
参数[data['argument']]=data['value'];
}
}
_routerService.navigationKey.currentState
.pushReplacementNamed(“${data['route']}”,参数:参数);
},
onLaunch:(映射消息)异步{
映射参数={};
地图数据=消息['data'];
if(data.containsKey('argument')){
if(data.containsKey('value')){
参数[data['argument']]=data['value'];
}
}
_routerService.navigationKey.currentState
.pushReplacementNamed(“${data['route']}”,参数:参数);
},
onResume:(映射消息)异步{
映射参数={};
地图数据=消息['data'];
if(data.containsKey('argument')){
if(data.containsKey('value')){
参数[data['argument']]=data['value'];
}
}
_routerService.navigationKey.currentState
.pushReplacementNamed(“${data['route']}”,参数:参数);
},
onBackgroundMessage:\u myBackgroundMessageHandler);
}
静态未来\u myBackgroundMessageHandler(
映射消息)异步{
最终RouterService_RouterService=locator();
if(message.containsKey('data')){
//处理数据消息
映射参数={};
地图数据=消息['data'];
if(data.containsKey('argument')){
if(data.containsKey('value')){
参数[data['argument']]=data['value'];
}
}
_routerService.navigationKey.currentState
.pushReplacementNamed(“${data['route']}”,参数:参数);
}
if(message.containsKey('notification')){
//处理通知消息
最终动态通知=消息['notification'];
}
}
}

有人能帮我解决这个问题吗?

我找到了解决办法。首先,您必须将此代码添加到清单中:

<intent-filter>
    <action android:name="FLUTTER_NOTIFICATION_CLICK"/>
    <category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
然后还可以作为数据传递,例如
route=>detailScreen

完成此操作后,通过检查FCM中通过的路由,可以调用firebase消息传递功能,如
onResume
OnLaunch

检查路线时,您可以使用此功能浏览任何屏幕:

//PRIVATE METHOD TO HANDLE NAVIGATION TO SPECIFIC PAGE
void _navigateToSignalsPage(Map<String, dynamic> message) {
  final MessageBean item = _itemForMessage(message);
  // Clear away dialogs
  //  Navigator.popUntil(context, (Route<dynamic> route) => route is PageRoute);
  if (!item.route.isCurrent) {
    print('heey girl ${item.route}');
    Navigator.push(
        context, MaterialPageRoute(builder: (context) => HomePage(selectedPage: 0,)));
  }
}
//处理特定页面导航的私有方法
无效(地图信息){
最终消息bean项=_itemForMessage(消息);
//清除对话框
//Navigator.popintil(context,(Route-Route)=>Route是PageRoute);
如果(!item.route.isCurrent){
打印('heeygirl${item.route}');
导航器。推(
context,materialpage(builder:(context)=>主页(selectedPage:0,);
}
}
//PRIVATE METHOD TO HANDLE NAVIGATION TO SPECIFIC PAGE
void _navigateToSignalsPage(Map<String, dynamic> message) {
  final MessageBean item = _itemForMessage(message);
  // Clear away dialogs
  //  Navigator.popUntil(context, (Route<dynamic> route) => route is PageRoute);
  if (!item.route.isCurrent) {
    print('heey girl ${item.route}');
    Navigator.push(
        context, MaterialPageRoute(builder: (context) => HomePage(selectedPage: 0,)));
  }
}