Flutter-继续收听页面更改时的流

问题描述 投票:0回答:1

我的情况是这样的:

  • 一个BottomNavigationBar,其中一个页面包含一个项目列表(“ listPage”),另一个页面是单个项目(“ itemPage”)。

  • 两个页面都可以导航到与其他项目相关的“ itemPage”。

  • “ itemPage”显示产品的详细信息,并具有“收藏夹”切换按钮。

  • 在“ listPage”中,通过ListView.builder显示的每个项目,显示并可以处理“收藏夹”切换按钮。

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

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

  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” 。

我该如何解决?

也许流必须传递到Page(不是PageState)?但是如何处理onData函数呢?

flutter navigation system.reactive
1个回答
0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.