Как перейти к новому виджету при получении удаленного уведомления?

#push-notification #flutter #firebase-cloud-messaging

#push-уведомление #flutter #firebase-облако-обмен сообщениями

Вопрос:

Чего я пытаюсь достичь в своем приложении, так это того, что когда пользователь получает push-уведомление, приложение отправляет новый виджет. Я правильно получаю данные уведомления, но не могу заставить его работать.

Это прослушиватель уведомлений

 _firebaseMessaging.configure(
      onMessage: (Map<String, dynamic> message) async {
        print('on message $message');
        _manageNotificationData(message);
      },
      onResume: (Map<String, dynamic> message) async {
        print('on resume $message');
         _manageNotificationData(message);
      },
      onLaunch: (Map<String, dynamic> message) async {
        print('on launch $message');
        _manageNotificationData(message);
      },
    );
  

Моя полезная нагрузка

 data: {
       "id" : "Id for notification state",
       "click_action": "FLUTTER_NOTIFICATION_CLICK","
       "orderId": "SomeId"
      }
  
 void _manageNotificationData(Map<String,dynamic> message){

 //When the user receives a notification, a new widget will appear so that he can rate another user

  if(message["id"] == 1){

  //This data is printed in the console
  print(message["orderId"]);

  //this is not working
    Navigator.push(
    context,
    MaterialPageRoute(builder: (context) => 
    RateProfessionalWidget(
    orderId: message["orderId"])
    ),
  );
  }

}
  

Я думаю, это не сработает, потому что я вызываю Navigator.push в главном файле, но в этом файле единственное место, где у меня есть доступ к данным уведомления. Как я могу заставить это работать?

Ответ №1:

Убедитесь, что ваше приложение (то, что вы runApp() ) является StatefulWidget , и в его состоянии создайте GlobalKey

 GlobalKey<NavigatorState> navigatorKey =
    GlobalKey<NavigatorState>(debugLabel: 'navKey');
  

При создании MaterialApp передайте ему ключ

   child: MaterialApp(
    navigatorKey: navigatorKey,
  

Теперь в вашем приложении вы можете использовать navigatorKey.currentState.push() etc