首页 > 解决方案 > Flutter - 在页面更改时继续收听流

问题描述

我的场景是这样的:

我不明白如何将“itemPage”中的“Favorite”更改反映到其他“itemPage”(如果为同一项目多次打开,是的,这是可能的)以及“pageList”中的同一项目。

我创建了一个 NotifierBloc,其中每次“收藏夹”切换按钮更改其状态(放置 itemId 和收藏夹的布尔值)时都会调用 BehaviorSubject > Sink。数据库更新后,输出 PublishSubject > Stream 将填充项目的附加信息。这样,每次切换“收藏夹”时,所有订阅者都会收到有关该标志的信息。

  BehaviorSubject<Item> inController = new BehaviorSubject<Item>();
  Sink<Item> get putUpdate => inController.sink;

  final PublishSubject<Item> outController = PublishSubject<Item>();
  Stream<Item> get getUpdates => outController.stream;

  NotifierBloc() {
    inController.listen(_handleToggle);
  }

  _handleToggle(Item item) {
    ...
    outController.sink.add(newItemAfterDatabaseCall);
  }

在 ListPage 和 ItemPage(都是 StatefulWidget)中,我在 DidChangeDependencies 方法中创建了一个 StreamSubscription,它监听 NotifierBloc 流。StreamSubscription 将在 Dispose 方法中取消。

  StreamSubscription _subscription;

  void didChangeDependencies() {
    super.didChangeDependencies();
    _subscription = _notifierBloc.getUpdates.listen((item) => {
          // Do things with the Item like setState or call bloc methods
          ...
        });
  }

  void dispose() {
    _subscription?.cancel();
    super.dispose();
  }

问题是当打开一个新的 itemPage 时:dispose 方法取消了上一个显示页面中的订阅,因此不会监听新事件。

此外,当由于上一页关闭而显示页面时,StreamSubscription 会更新,我会收到有关最后一个收藏更改的更新,但我需要收藏更改的列表,因为用户可能打开了几个“itemPage”。

我该如何解决?

也许必须将 Stream 传递给 Page(而不是 PageState)?但是如何处理 onData 函数呢?

标签: flutternavigationsystem.reactive

解决方案


你需要某种状态管理系统。调查Provider。这是一个如何使用它的简单示例。https://github.com/m-Skolnick/provider_example_flutter


推荐阅读