Flutter相当于LocalBroadcastManager和NSNotificationCenter

时间:2018-08-31 07:31:36

标签: asynchronous flutter

我正在开发一个Flutter应用,该应用在后台同步数据。我想在不同的屏幕上显示同步状态。因此,我想将事件“同步成功”和“同步失败”传递给订阅它们的任何屏幕。经过一些调查,最好的Flutter等效于Android LocalBroadcastManager和iOS NSNotificationCenter似乎是StreamController.broadcast。但是,在所有示例中,使用广播时都会在类/模型中实例化广播,但是在我的情况下,创建屏幕时必须订阅它,因此广播必须已经存在,而可以实例化API类在此之前或之后。

我想到的唯一解决方案是在API类中有一个静态StreamController.broadcast,所有屏幕都可以订阅和取消订阅,而API类本身可以提供事件:

class ApiRequest {
  static StreamController syncDoneController = StreamController.broadcast();

  Future startSync() async {
    List response = await executeRequest("");
    if (response == null) {
      syncDoneController.add("failed");
    } else {
      syncDoneController.add("success");
    }
  }
}

class _SomeScreenState extends State<SomeScreen> {
  StreamSubscription<dynamic> _streamSubscription;

  @override
  void initState() {
    super.initState();
    _streamSubscription = ApiRequest.syncDoneController.stream.listen((value) {
      apiUpdated(value);
    });
  }

  @override
  void dispose() {
    _streamSubscription.cancel();
    super.dispose();
  }

  void apiUpdated(String result) async {
    if (result == "failed") {
      // show "failed" state
    } else {
      // show "success" state
    }
  }
}

这工作正常,但是我收到警告,应该关闭syncDoneController。由于它是静态的,因此我希望它可以保留整个应用程序生命周期,但是我担心这是内存泄漏,否则可能会导致其他任何问题。

有更好的方法还是正确的方法?

0 个答案:

没有答案