在 Flutter 中使用 ListView 从 API 检索 json 对象列表时。拥有有状态或无状态小部件是不是正确?

Posted

技术标签:

【中文标题】在 Flutter 中使用 ListView 从 API 检索 json 对象列表时。拥有有状态或无状态小部件是不是正确?【英文标题】:When using a ListView in flutter to retrieve a list of json objects from an API. Is it the right way to have an Stateful or Stateless Widget?在 Flutter 中使用 ListView 从 API 检索 json 对象列表时。拥有有状态或无状态小部件是否正确? 【发布时间】:2021-11-19 19:17:29 【问题描述】:

假设我有一个带有 2 条路线的简单应用程序。主路径是配置文件,第二个是项目。所以这个想法是,当用户单击项目图标时,应用程序应该移动到该路线并显示所有用户的项目。问题是这个项目 Widget 应该是 Stateless 还是 Stateful?考虑到我希望用户拉动刷新此 Route 并在 Listview 中重新加载 api。

【问题讨论】:

【参考方案1】:

它绝对应该是一个有状态的小部件,因为您期望来自 API 的数据。无状态小部件无法更改,您应该只在页面上的数据是静态的情况下使用无状态小部件。

【讨论】:

但是我可以在渲染无状态小部件之前调用 API 并在 ListView 中渲染结果吗?考虑到 ListView 不会改变,除非用户拉动刷新,这相当于重新渲染 ListView。 你在哪里调用API?因为据我所知,init state 函数仅在有状态小部件中可用。 让我到了那里。我可以手动创建布尔值来管理它,但最好使用 Stateful。【参考方案2】:

它绝对是一个有状态的小部件,因为无状态的小部件不能改变它们的状态。

【讨论】:

您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center。 你能解释一下你的答案吗? 因为当我们需要页面上的静态内容时使用无状态小部件,例如条款和条件页面。【参考方案3】:

我知道您已经接受了正确的答案,但想补充一点,如果您使用 Provider、Bloc、GetX 等状态管理解决方案...它们都提供了可以刷新 ListView 的小部件,而无需需要在有状态的小部件中。

与在有状态小部件中调用 setState 相比,这将是一种更简洁、更具可扩展性的解决方案。

【讨论】:

你知道这很有趣。我知道 Bloc 是前进的最佳方式,但我也听说要复杂得多。只是我不明白为什么在字面上我可以使用无状态并且一旦用户拉动刷新重新绘制小部件时使用有状态。但正如 Becca 解释的那样,我需要一种调用 API 的方法,对吧? 您可以使用任何状态管理解决方案来完成此操作。在我看来,GetX 是最简单的并且具有最少的样板代码。但是不要纠结于哪一个是“最好的”。但我强烈建议选择一个开始并学习它。调用 API 的代码应该存在于通知和更新 UI 的外部状态管理类中。

以上是关于在 Flutter 中使用 ListView 从 API 检索 json 对象列表时。拥有有状态或无状态小部件是不是正确?的主要内容,如果未能解决你的问题,请参考以下文章

从 ListView.builder Flutter 中删除项目

在 Flutter 中使用 InheritedWidget 时 ListView 失去滚动位置

Flutter/Dart 如何将索引从 Listview.builder 传递到项目小部件

Flutter从ListView的左滑删除,简单理解KeyWidget与Element之间的关系

Flutter从ListView的左滑删除,简单理解KeyWidget与Element之间的关系

Flutter:在 ListView 中动画项目删除