'Flutter FCM: Storing Notification Data while the app is in the Background/Closed

I am trying to store data received via FCM inside a class in order to navigate to a specific tab of my app after a user clicks on that notification.

My problem is that, as far as I could find on the web, the MainActivity is stopped when the app is not in the Foreground, and so, when I try and retrieve this data, I am not getting the updated variables. I have checked this using print statements throughout the app.

In order to store the information and use it when the app is brought back up, do I need to create a local database, or is there another way around this problem?

PS: I have a Stream that receives information that the user has clicked on the notification, and it updates the main page, but I cannot retrieve anything else from it, as it itself doesn't receive the json.

Thank you. Also, this was my first question posted here, be gentle if I didn't follow the protocol by the letter.

Sample code below.

Initialization:

FirebaseOption options = FirebaseOptions(
      apiKey: 'XXXXXXXXXXXXXXXXXXXXXXXXXXx',
      appId: 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX',
      messagingSenderId: 'XXXXXXXXXXXXXX',
      projectId: 'XXXXXXXXXXXXx',
);
Future<void> backgroundHandler(RemoteMessage message) async {
  await Firebase.initializeApp(
    options: options,
  );
  var decoded = await NotificationModelPusherAG.fromJson(message.data);
  var encodedMessage = await json.decode(decoded.message);
  var decodedMessage = await PusherMessage.fromJson(encodedMessage);
  notifications.type = message.data;
  FirebaseNotifications.showNotification(decodedMessage.title, decodedMessage.description, message.data);
}
Future<void> main() async {
  WidgetsFlutterBinding.ensureInitialized();
  final String INSTANCE_ID = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX';
  await PusherBeams.start(INSTANCE_ID);
  await Firebase.initializeApp(
    options: options,
  );
  /// Run this funk when a notification is received and app is in BG
  FirebaseMessaging.onBackgroundMessage(backgroundHandler);
  runApp(MyApp());
}

The class in which the data is stored:

class Notifications {
  var tab = 0;
  int get returnTab => return tab;
  final _notificationUpdateController = BehaviorSubject();
  Stream get update => _notificationUpdateController.stream;
  shouldUpdate(add) {
    _notificationUpdateController.sink.add(add);
  }
  void set type(messageData) {
    if (messageData['type'] == 'xxxxxxx') {
      this.tab = 1;
    }
}
var notifications = Notifications();

The widget that should update:

StreamBuilder<Object>(
    stream: notifications.update,
      builder: (context, snapshot) {
         if (updateMulti == true) {
             print(notifications.returnTab); /// Here it is '0'
             return multiScreen;
           } else {
             return multiScreen;
           }
         }
      );

And the function that updates it:

flutterNotificationPlugin.initialize(
        initSettings,
        onSelectNotification: onSelectNotification
);


static Future onSelectNotification(String payload) {
    print(payload); /// The payload is always null for some reason
    print(notifications.returnTab); /// Here it shows '1' as it should
    updateMulti = true;
    notifications.shouldUpdate(true);
}

I kind of shortened the code a bit, if I missed something important do tell me, and I shall update accordingly.

Thank you again.



Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source