Search code examples
flutterfirebase-cloud-messagingsharedpreferences

Flutter SharedPreferences save in Firebase FCM background and load by button doesn't work


I wanna save value to SharedPreferences when FCM receive message in background (testing on Android emulator):

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

  prefs = await SharedPreferences.getInstance();

  if (await prefs.setString("test", "test")) {
    debugPrint("Success");
  } else {
    debugPrint("Error");
  }
  debugPrint("Keys: ${prefs.getKeys().toString()}");
}

FirebaseMessaging.onBackgroundMessage(_firebaseMessagingBackgroundHandler);
Future<void> _printKeys() async {
  prefs = await SharedPreferences.getInstance();
  setState(() {
    debugPrint("BUTTON Keys: ${prefs.getKeys().toString()}");
  });
}
ElevatedButton(
  onPressed: () async => await _printKeys(),
  child: const Text("get SP keys"))

When App in background, message is received, then I put App to foreground and press "get SP keys" button. Edit: The key is not present. Log:

Success               <== FCM BG
Keys: {oldVal, test}  <== FCM BG
BUTTON Keys: {oldVal} <== Button
shared_preferences 2.0.15
shared_preferences_android 2.0.14
shared_preferences_ios 2.1.1
shared_preferences_linux 2.1.2
shared_preferences_macos 2.0.5
shared_preferences_platform_interface 2.1.0
shared_preferences_web 2.0.4
shared_preferences_windows 2.1.2

When App is restarted, "test" key is available in SharedPreferences.

What's wrong and how can App get consistent values from SharedPreferences?


Solution

  • OK finally figured solution out. It seem SharedPreferences is out of sync in described case. What I did was adding prefs.reload() in between and it worked :-)

    SharedPreferences.getInstance().then((prefs) => {
      prefs.reload().then((_) {
        // Do the staff
      })
    });
    

    Strange since App should have only one instance of SP.