【问题标题】:FutureBuilder vs initState in FlutterFlutter 中的 FutureBuilder 与 initState
【发布时间】:2019-01-20 08:48:16
【问题描述】:

我想在我的 Flutter 应用程序中从 SQLite 数据库加载一些数据,并将结果显示在 ListView 中。我目前正在使用FutureBuilder 小部件从数据库中异步获取数据,然后构建ListView

但是,如果我想对数据进行一些操作 - 例如修改一些信息并保存到数据库中-然后在ListView中显示更新的数据,我想我必须先将数据存储在局部变量中,然后调用setState()方法对数据进行更改并重新- 构建页面。

在不使用FutureBuilder 的情况下,还有其他更好/首选的方法来实现相同的目标吗?

【问题讨论】:

    标签: flutter


    【解决方案1】:

    https://stackoverflow.com/a/52021385/11252673

    build() 可能会被多次调用 - 这就是为什么这种初始化在 initState 上会更好。

    【讨论】:

      【解决方案2】:

      initState 在您的小部件第一次初始化时被调用。在那里你做了一些初始化操作。

      我认为您使用 FutureBuilder 是对的,因为您的 UI 是在从数据库中获取数据后生成的。

      我会做以下事情之一:

      • 继续使用FutureBuilder,然后在编辑数据时执行async 操作以更新数据库,并在数据库更新后调用setState 以在UI 上反映更改。

      • 使用StreamBuilder,它类似于FutureBuilder,但不是只构建一次,而是在每次附加到它的流上发生更改时重新构建。这样,您只需要更新数据源,小部件就会使用新数据自行更新。

      谈到第二个解决方案,我不能再进一步了,因为我从未实现过允许这样做的Stream(我一直将StreamBuilderFirebase 流一起使用)。

      第一个解决方案允许您更新显示的数据,而无需再次向数据库询问整个数据集。

      我可能会感谢其他人对第二种解决方案的一些反馈,因为我不确定StreamBuilder 如何管理数据更改。

      如果我发现更多信息,我会告诉你的!

      【讨论】:

      • 感谢@magicleon94,经过大量研究,我现在采用了使用 FutureBuilder 的解决方案 1,但很好奇这是否是一种有效的方法。我仍然需要了解 StreamBuilder 和 Firebase。将继续发布。
      • 嗯,我认为它非常有效。您只传输您需要的内容并在本地刷新 UI,以及 Flutter 所做的所有优化;) 提前感谢您对 StreamBuilder 的任何反馈:D
      • @RakeshK 所以您正在更新数据库,然后再次从数据库中获取数据?我正在尝试自己解决这个问题,但我只想获取一次数据,然后将更改发布到数据库。对每个更改进行 POST 和 GET 感觉就像一个糟糕的实现?
      猜你喜欢
      • 2018-11-23
      • 1970-01-01
      • 2021-02-06
      • 1970-01-01
      • 2022-10-25
      • 2021-07-19
      • 2019-12-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多