【问题标题】:How to use multiple Consumers for a single widget in flutter Provider如何在flutter Provider中为单个小部件使用多个消费者
【发布时间】:2020-05-10 01:17:30
【问题描述】:

我无法将多个消费者用于带有提供者的单个小部件?假设我的小部件是 CurvedNavigationBar,并且该小部件中有 4 个项目。我还有 4 个扩展 ChangeNotifier 的不同类,负责 CurvedNavigationBar 中的每个项目。

如何在一个小部件中收听这 4 个更改通知器?我查看了文档,找不到这样的例子..这甚至可能吗?我发现 Consumer 有一个 builder 方法,这意味着您可以只构建一个小部件/只听一次。

我是否应该有一个扩展 ChangeNotifier 的类,然后更新该小部件中的值并仅使用一个 Consumer 来侦听更新的值?

【问题讨论】:

    标签: flutter provider flutter-provider


    【解决方案1】:

    还有一些其他的Consumer 小部件。 Consumer2Consumer3Consumer4 直到 Consumer6。如果你想听 4 ChangeNotifier 你可以使用Consumer4

    Consumer4(
      builder: (context, changeNotifier1, changeNotifier2, changeNotifier3, changeNotifier4, child) {
        // your widget
      }
    )
    

    【讨论】:

    • 这种设计是不是很奇怪?如果你需要 7 个或更多的状态怎么办?
    • @CameronSima 老实说,我不知道为什么要这样实现。你可以在github.com/rrousselGit/provider/blob/master/lib/src/…中看到实现
    • ConsumN 这件事让我大笑,不是因为他们解决了我的问题。
    【解决方案2】:

    是的,您最多可以添加 6 个消费者,如下所示

        Consumer2<AuthProvider, StorageProvider>(
        builder: (context, authProvider, storageProvider, child) {
    
        }
        )
    

    【讨论】:

      【解决方案3】:

      还有另一种方法可以访问您的提供商:Provider.of&lt;SomeProvider&gt;(context):

      Widget build(BuildContext context) {
        final authProvider = Provider.of<AuthProvider>(context);
        final apiProvider = Provider.of<ApiProvider>(context);
        final storageProvider = Provider.of<StorageProvider>(context);
      
        // Do your usual stuff without wrapping it into Consumer,
        // just pass providers directly to your targets.
        return MyAwesomeWidget(
          authProvider,
          apiProvider,
          storageProvider,
        );
      }
      

      【讨论】:

      • 我和你有同样的错误(包括使用 Builder Widget),请测试它,你会看到它工作,但它有性能问题,应用程序将减慢至少 33% 3 个提供商。我必须投反对票。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-06-18
      • 2015-09-03
      • 2018-03-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多