我有不一致的共享首选项值的问题。我将尝试尽可能简单地描述它。
我正在使用 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);
}
}
场景一:场景2:
问题:知道为什么字段没有更新吗?
最佳答案
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/