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?
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.