Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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?

like image 615
d3im Avatar asked Nov 07 '25 21:11

d3im


1 Answers

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.

like image 134
d3im Avatar answered Nov 09 '25 12:11

d3im