Flutter 颤振:共享偏好的奇怪行为

Flutter 颤振:共享偏好的奇怪行为,flutter,firebase-cloud-messaging,sharedpreferences,Flutter,Firebase Cloud Messaging,Sharedpreferences,我有一个共享首选项值不一致的问题。我将尽可能简单地描述它 我正在使用Firebase云消息发送推送通知。当应用程序位于后台且收到通知时,将调用后台处理程序bellow Future<void> _firebaseMessagingBackgroundHandler(RemoteMessage message) async { final SharedPreferences prefs = await SharedPreferences.getInstance(); final

我有一个共享首选项值不一致的问题。我将尽可能简单地描述它

我正在使用Firebase云消息发送推送通知。当应用程序位于后台且收到通知时,将调用后台处理程序bellow

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);
  });
}
情景1:

  • 应用程序打开,收到通知-将徽章字段设置为1
  • 应用程序位于后台,收到通知-后台处理程序将“徽章”字段设置为2
  • 应用程序恢复,读取徽章字段,仍然为1
情景2:

  • 应用程序打开,收到通知-将徽章字段设置为1
  • 应用程序位于后台,收到通知-后台处理程序将“徽章”字段设置为2
  • 应用程序位于后台,收到通知-后台处理程序将“徽章”字段设置为3
  • 应用程序恢复,读取徽章字段,仍然为1

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

SharedReferences或任何其他本地存储在\u firebaseMessagingBackgroundHandler中不起作用

您应该在getInitialMessage或OnMessageGeoPenedApp上捕获它。

TL;博士: 当应用程序从终止状态打开时,会触发getInitialMessage。当应用程序从后台状态打开时,会触发OnMessagePointApp

FirebaseMessaging.instance.getInitialMessage().then((RemoteMessage message) {
  if (message != null) {
    Navigator.of(context).pushNamed('/messages', arguments: message.data);
  }
});

FirebaseMessaging.onMessageOpenedApp.listen((RemoteMessage message) {
  if (message != null) {
    Navigator.of(context).pushNamed('/messages', arguments: message.data);
  }
});

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

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

SharedPreferences prefs= await SharedPreferences.getInstance();
await prefs.reload();
final int counter = (prefs.getInt('badge') ?? 0);