flutter : Strange behavior of Shared Preferences

标签 flutter firebase-cloud-messaging sharedpreferences

我有不一致的共享首选项值的问题。我将尝试尽可能简单地描述它。
我正在使用 Firebase Cloud Messaging 进行推送通知。当应用程序在后台并且通知进来时,调用后台处理程序波纹管。

Future<void> _firebaseMessagingBackgroundHandler(RemoteMessage message) async {
  final SharedPreferences prefs = await SharedPreferences.getInstance();
  final int counter = (prefs.getInt('badge') ?? 0) + 1;

  prefs.setInt('badge', counter).then((bool success) {
    print(counter);
  });
}
我的小部件使用 WidgetsBindingObserver 来确定生命周期状态。当我进入应用程序时,该小部件的状态是 onResume 并且我想从这样的共享首选项中读取该徽章值。
void didChangeAppLifecycleState(AppLifecycleState state) {
    if (state == AppLifecycleState.resumed) {
      final SharedPreferences prefs = await SharedPreferences.getInstance();
      final int counter = (prefs.getInt('badge') ?? 0); 
      print(counter);
    }
  }

场景一:
  • 应用程序打开,通知进来 - 将徽章字段设置为 1。
  • 应用程序在后台,通知进来了 - 后台处理程序将徽章字段设置为 2。
  • 应用程序恢复,阅读那个徽章字段,它仍然是 1。

  • 场景2:
  • 应用程序打开,通知进来 - 将徽章字段设置为 1。
  • 应用程序在后台,通知进来了 - 后台处理程序将徽章字段设置为 2。
  • 应用程序在后台,通知进来了 - 后台处理程序将徽章字段设置为 3。
  • 应用程序恢复,阅读那个徽章字段,它仍然是 1。

  • 问题:知道为什么字段没有更新吗?

    最佳答案

    SharedPreferences 可用于后台事件处理程序。问题是后台处理程序在不同的隔离中运行,因此,当您尝试获取数据时,共享首选项实例为空。为避免这种情况,您只需强制刷新:

    SharedPreferences prefs= await SharedPreferences.getInstance();
    await prefs.reload();
    final int counter = (prefs.getInt('badge') ?? 0);
    
    在相同的模式下,如果共享首选项可以在后台 hadler 中修改,请确保在尝试读取它们时在主隔离中调用此“重新加载”函数。

    关于 flutter : Strange behavior of Shared Preferences,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64961326/

    相关文章:

    java - 为什么 SharedPreference 在 RecyclerView 中不起作用

    android - flutter 运行失败,错误为 "Could not resolve the package ' 中的 'package:characters/characters.dart' 个字符。”

    android - Flutter:无法解析com.android.support:support-v4:27.1.0

    flutter - 如何在 dart/flutter 中收听流值

    android - Google 的 Firebase 下游消息的 http post 请求的 `Authorization` 部分是什么?

    android - 在 Android 应用之间共享进度数据

    c - Dart RawSockets 有什么用?

    python - 如何使用 fcm_django 在 IO 上发送推送通知

    android - Firebase Cloud Messaging (FCM) - 当用户点击带有附加功能的通知时启动 Activity

    android - 从 Assets 文件夹获取mp3文件列表并保存为共享首选项