当 FCM 在后台接收消息时,我想将值保存到 SharedPreferences(在 Android 模拟器上测试):
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"))
当应用程序在后台时,收到消息,然后我将应用程序置于前台并按“获取 SP key ”按钮。编辑: key 不存在。 日志:
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
当应用程序重新启动时,“test”键在 SharedPreferences 中可用。
出了什么问题,应用程序如何从 SharedPreferences 获取一致的值?
最佳答案
好的,终于找到解决方案了。在所描述的情况下,SharedPreferences 似乎不同步。
我所做的是在两者之间添加 prefs.reload()
并且它起作用了:-)
SharedPreferences.getInstance().then((prefs) => {
prefs.reload().then((_) {
// Do the staff
})
});
奇怪,因为应用程序应该只有一个 SP 实例。
关于Flutter SharedPreferences 保存在 Firebase FCM 后台并通过按钮加载不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75080929/