Flutter SharedPreferences 保存在 Firebase FCM 后台并通过按钮加载不起作用

标签 flutter firebase-cloud-messaging sharedpreferences

当 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/

相关文章:

api - 如何使用 Dart http 库、flutter 实现 Post API 调用

当 sqflite 数据库数据更改时,Flutter 提供程序监听器不会自行更新

firebase - FCM - 推送通知仅适用于控制台,不适用于 postman

android - 共享首选项初始声明

java - 如何保存ArrayList <List>

flutter - 如何导航到屏幕并删除所有溃败历史记录 [注销功能]

Flutter - 如何在表单数据中发送多个图像

javascript - 如何在我的 Rails 应用程序中减小 firebase.js 的大小

php - 从 Firebase 云消息传递获取 "InvalidTokenFormat, Error 400"

Android - 跨配置文件的 SharedPreferences