【发布时间】:2021-11-29 08:25:02
【问题描述】:
有两种方法可以退出我们的 Android (Flutter) 应用,我们可以反复按返回按钮,也可以直接按主页按钮
如果用户按下home button(不是返回按钮),则应用程序将在后台运行。我向用户发送 FCM(Firebase 云消息传递)推送通知,应用程序将在后台处理程序中接收消息。然后我像这样在共享首选项中保存一个字符串
Future<void> firebaseMessagingBackgroundHandler(RemoteMessage message) async {
final prefs = await SharedPreferences.getInstance();
await prefs.setString("myKey", "value here");
final testValue = prefs.getString("myKey");
print("value in background handler: $testValue"); // I confirm I can get the saved value here
}
从上面的代码可以看出,我可以从firebaseMessagingBackgroundHandler中的共享偏好中获取值
用户收到推送通知后,打开应用,直接打开首页。
在首页,我尝试获取之前保存的值
@override
void initState() {
super.initState();
WidgetsBinding.instance?.addPostFrameCallback((_) async {
final prefs = await SharedPreferences.getInstance();
final savedValue = prefs.getString("myKey");
print(savedValue); // I get null here initially
});
}
如您所见,当我直接返回应用程序时,我得到了 null 值。我必须再次使用back button 退出应用程序,然后最终我可以从共享首选项中获取字符串值。
为什么我必须按返回按钮才能从共享偏好中获取值?如何解决?
【问题讨论】:
-
仅仅因为您让
print("value in background handler: $testValue");打印该值并不意味着它已保存在本地存储中。开发人员最有可能将数据保存在 RAM 中的某个集合中,这样您就不必在应用程序的生命周期内从磁盘加载它。基本上,这意味着无论出于何种原因(可能是操作系统的某些限制),都不会执行 IO 操作,并且如果您阅读有关共享首选项的文档,则会有关于可靠性的说明。 -
@Alexa289 你找到解决方案了吗?
标签: android flutter firebase-cloud-messaging sharedpreferences flutter-sharedpreference