【问题标题】:flutter global variable becomes null when app is in background当应用程序处于后台时,颤动全局变量变为空
【发布时间】:2021-01-11 09:26:47
【问题描述】:

我有一个消息应用程序,它接收来自 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,并且没有任何作用。

  1. 首先,为什么会这样?如果我将应用程序带回前台,streamtable 不是null
  2. 当应用在后台时如何存储收到的数据?

【问题讨论】:

    标签: flutter dart push-notification firebase-cloud-messaging


    【解决方案1】:

    移动系统的工作方式与桌面系统不同。对于桌面系统,“在后台”只是意味着 UI 不在顶部,但程序正在运行。对于移动系统,“在后台”意味着应用程序未被使用,因此可以在操作系统认为合适的任何时候终止。

    不同的系统有不同的回调来通知应用程序阻止关闭,以便它可以将其最后的数据写入存储并在再次调用时从该状态恢复。

    认为您的应用拥有全局数据并将其保留在内存中的想法,因为它正在运行,只是“在后台”是不正确的。它不会。它可以在移动系统上随时消失。

    您需要实际保存以后要恢复的数据,“内存”只有在前台或操作系统感觉足够大时才会持续。

    【讨论】:

      【解决方案2】:

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-07-14
        • 1970-01-01
        • 2015-05-26
        • 1970-01-01
        • 2012-02-22
        • 2012-10-23
        • 1970-01-01
        相关资源
        最近更新 更多