Как обновить пользовательский интерфейс с помощью фоновых уведомлений FCM?

# #firebase #flutter #firebase-cloud-messaging

Вопрос:

Я хочу перейти на какую-то страницу, когда пользователь нажимает на уведомление. Я использую облачные сообщения и настройки flutter_local_notifications. Мне удалось сделать это с помощью уведомлений на переднем плане. Это было довольно просто. Я вставил тот же код в свой обработчик фоновых уведомлений, но он не сработал. Также я искал обратный вызов onTap для уведомлений, но не смог найти ничего, связанного с этим.

Вот мой обработчик фоновых уведомлений.

 Future<void> _firebaseMessagingBackgroundHandler(RemoteMessage message) async {
  await Firebase.initializeApp();

  var androidDetails = AndroidNotificationDetails(
    "Channel ID",
    "Shannonside",
    "Shannonside Channel",
  );

  var iosDetails = IOSNotificationDetails();

  var details = NotificationDetails(
    android: androidDetails,
    iOS: iosDetails,
  );

  if (message.notification != null) {
    final title = message.notification.title;
    final body = message.notification.body;
    await NotificationService.localNotification.show(0, title, body, details);
  }
  if (message.data != null) {
    var articleId = message.data['articleId'];
    var category = message.data['category'];
    if (articleId != null amp;amp; category != null) {
      print("ArticleID: $articleId Category $category");
      //@TODO Add navigation service and move to the article detail
      NavigatorService.instance.navigateTo("/articlePage", arguments: {
        "articleId": articleId.toString().toLowerCase(),
        "category": category.toString().toLowerCase(),
      });
    }
  }
}
 

Это не работает, даже моя функция не сработала. Также они заявили в документации, что это невозможно.

Поскольку обработчик выполняется в своей собственной изоляции вне контекста ваших приложений, невозможно обновить состояние приложения или выполнить какую-либо логику, влияющую на пользовательский интерфейс. Однако вы можете выполнять логику, такую как HTTP-запросы, операции ввода-вывода (обновление локального хранилища), взаимодействовать с другими плагинами и т.д.

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

Комментарии:

1. Проверьте это: pub.dev/пакеты/firebase_messaging

2. @Andrej Я уже читал документацию FlutterFire о сообщениях Firebase. Также вставил какую-то цитату из документации. Если вы думаете, что я что-то упускаю, дайте мне знать, а не отправляйте всю документацию.

Ответ №1:

Вы можете использовать функцию

   FirebaseMessaging.instance
        .getInitialMessage()
        .then((RemoteMessage message) {
      print("FirebaseMessaging.getInitialMessage");
      if (message != null) {

        Navigator.of(context).pushNamed('/call');
      }
    });
 

Эта функция запускается только в первый раз, когда приложение открывается, оно получает последнее сообщение