我有一个消息应用程序,它从Firebase Cloud messaging接收推送通知,当它接收到推送通知时,它会将其推送到流中。为了跟踪不同的流,我有一个streamtable
,它是一个全局变量。这就是我的
Map<String, StreamController<dynamic>> streamtable;
Future<dynamic> myBackgroundMessageHandler(Map<String, dynamic> message) async {
log('FCM onBackground: $message');
log('streamTable: $streamtable');
addToStream(message);
await showNotification(message);
return;
}
bool addToStream(Map<String, dynamic> message) {
var data;
if (Platform.isAndroid) {
data = message['data'];
} else if (Platform.isIOS) {
data = message;
}
bool status;
try {
switch (data['streamType']) {
case "Message":
streamtable['MessageStream'].add(message);
status = true;
break;
default:
log("streamType: ${data['streamType']}");
status = false;
break;
}
} catch (e) {
status = false;
log('addToStream: error($e)');
}
return status;
}
当应用程序处于前台时,一切都很好。然而,当应用程序在后台时,streamtable
变为null
,什么都不起作用。
- 首先,为什么会发生这种情况?如果我将应用程序带回前台,则
streamtable
不是null
- 当应用程序处于后台时,我如何存储收到的数据
移动系统的工作方式与桌面系统不同。对于桌面系统;在背景中";只是意味着UI不在顶部,但程序正在运行。对于移动系统;在背景中";这意味着该应用程序没有被使用,因此操作系统可以在任何时候杀死它。
不同的系统有不同的回调来通知应用程序阻止关闭,这样它就可以将最后的数据写入存储器,并在再次调用时从该状态恢复。
你的应用程序保存全局数据并将其保存在内存中,因为它正在运行,只是";在背景中";不正确。不会的。它可以在移动系统上随时消失。
您将需要实际保存以后要恢复的数据;存储器";只有当它在前台或操作系统感觉很大方时才会持续。
这似乎是一个flutter中的错误:(https://github.com/FirebaseExtended/flutterfire/issues/1878)