ChangeNotifierProxyProvider 构建器与更新问题

Posted

技术标签:

【中文标题】ChangeNotifierProxyProvider 构建器与更新问题【英文标题】:ChangeNotifierProxyProvider builder vs update issue 【发布时间】:2020-07-22 00:18:47 【问题描述】:

我正在使用提供者:^3.0.0,其中包含我提供数据的 ChangeNotifierProxyProvider 参数“builder”。现在提供程序版本已更改,现在它的更新版本是提供程序:^4.0.4,它没有“构建器”功能,现在它具有创建和更新功能。请告诉我,创建和更新背后的逻辑是什么。 我认为 crates 只在第一次运行,而在第一次之后每次都运行更新? 我对吗!但是我有一个问题,我必须将一些数据传递给参数中的下一个类。 查看我的代码

    ChangeNotifierProxyProvider<Auth, Shops>(
      create: (ctx)=> Shops('778b2f743f2aebd4d73d2431881a88ba54c53c01', []),
      update: (ctx, auth, prevShop)=> Shops(auth.token, prevShop.items),
      ),

我想将 authToken 传递给 Shop 类,更新时可以从该 auth 对象中获取此数据,但在创建时我应该怎么做? 我想将商店列表作为商店类中的第二个参数传递,这将是从我的服务器获取的商店列表,但在这里因为我没有和引用所以我必须在创建中传递一个空列表。

这意味着第一次加载页面时没有商店列表,当我再次打开同一页面时,商店列表将显示在屏幕上。

请帮我解决这个问题。

【问题讨论】:

【参考方案1】:

我也遇到了同样的问题。我搜索了文档并找到了解决方案。

您需要在 Shops() 类中定义函数 update() 来接收您的参数: auth.tokenprevShop.items ,您需要在该更新功能中更新您想要的任何内容。

ChangeNotifierProxyProvider<Auth, Shops>(
      create: (ctx)=> Shops(),
      update: (ctx, auth, prevShop)=> prevShop..update(auth, prevShop.items),
      ),

我们使用 ..update(auth.token, prevShop.items) 来返回相同的 Shops() 小部件。

【讨论】:

如何通知项目已更新?如果您在更新函数中使用notifyListeners(),那么您将收到错误setstate() or markneedsbuild() called during build【参考方案2】:

这样做

ChangeNotifierProxyProvider<Auth, Shops>(
          create: (ctx) => Shops('', []),
          update: (ctx, auth, prevShop) => Shops(
              auth.token.toString(),
              prevShop == null ? [] : prevShop.items)
              ),

【讨论】:

您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center。

以上是关于ChangeNotifierProxyProvider 构建器与更新问题的主要内容,如果未能解决你的问题,请参考以下文章