【问题标题】:How does the listen: false work in Flutter Providers?在 Flutter Providers 中,listen: false 是如何工作的?
【发布时间】:2020-11-12 21:29:35
【问题描述】:

我刚开始学习 Flutter,并且正在学习 Udemy 课程“Flutter & Dart - The Complete Guide”。在那门课程中,有一节是关于构建使用提供程序的购物应用程序的。在该应用程序的一个实例中,用户在 Dismissible 小部件的帮助下滑动以从购物车页面(或屏幕/路线)中删除产品,他使用提供程序类中的一个函数(该函数采用产品 ID)来删除购物车中的商品。

这是我不明白的事情。 Dismissible 小部件通过 onDismissed 属性(在滑动后触发)中的此代码连接到提供程序:

Provider.of<Cart>(context, listen: false).removeItem(productId);

这一切都像这样工作得很好。但是,如果您删除了 listen 参数(因此将其变为默认状态,即 true),那么 Dismiss animation 仍然会发生,但 removeItem() 方法不会t 工作,并且购物车仍然保持不变。

为什么会这样?

【问题讨论】:

  • 查看此链接并告诉我它有帮助! stackoverflow.com/questions/58584334/…
  • @QuestionableCoder 这不完全是我的问题。我不是在问是否有不同寻常的重建。我在问代码不听就不能工作:假。

标签: flutter dart flutter-dependencies


【解决方案1】:

当我们使用 listen: false 时,我们告诉我们在删除一个项目后不要重建小部件,但他们知道我们正在删除一个项目,所以我们不需要在这里监听任何值,它只是在执行删除操作

【讨论】:

    【解决方案2】:

    我将在整个答案中将方法 Provider.of(context, listen: true) 称为 x

    x 预计仅用于 Widget 的属性,即

    • 预计会发生变化;和
    • 可以重建。例如:
    SizedBox(
      width: Provider.of<MyLogic>(context, listen: true).width,
    )
    

    当以这种方式使用时,x 只会在 context 所有者正在构建/重建时被调用。

    为了确保它被正确使用,x 每次调用它时都会执行一次完整性检查,确保您传递的 context 的所有者实际上正在构建/重建。当您从您的 onPressed 或您调用它的任何方法中调用 x 时,x 会看到 context 所有者不在“构建”阶段,并引发此错误。

    还有更多细节,但你实际上不需要了解更多信息(尤其是你刚刚开始),除非你想为这个包做出贡献,在这种情况下你应该阅读他们的@987654321 @。

    附注:您现在可以使用context.watch()context.read() 代替Provider.of()

    【讨论】:

      猜你喜欢
      • 2020-02-23
      • 1970-01-01
      • 1970-01-01
      • 2020-09-27
      • 2023-04-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-04
      • 2016-01-16
      相关资源
      最近更新 更多