【问题标题】:flutter - realtime stream data from REST APIflutter - 来自 REST API 的实时流数据
【发布时间】:2020-07-01 15:26:23
【问题描述】:

我正在使用流从 REST API 检索数据,但是当数据库中的数据更新时,流不会刷新应用中的数据。

StreamController _productsController = new StreamController();
...         
//products is a list that contains the data
_productsController.add(products);
...
body: Container(
        child: StreamBuilder(
            stream: _productsController.stream,
            builder: (BuildContext context, AsyncSnapshot snapshot) {...}

我看到一个解决方案建议定期从 API 重新加载数据,例如每 1 秒一次。

Timer.periodic(Duration(seconds: 1), (_) => loadDetails());

来源:Stream for API coming from PHP in Flutter (Not Firebase)

我不认为这是一种有效的方法。例如,在我的应用中,我想在不重新加载数据的情况下集成数据更改。

有没有一种有效的方法可以让流在不重新加载数据的情况下反映应用中的数据变化?

【问题讨论】:

  • 有什么更新吗?
  • @ZeffryReynando 您可以使用计时器,但这不是一种有效的方法,或者在适用的情况下使用套接字,否则使用另一种替代方法,例如 firebase/firestore 实时

标签: flutter dart


【解决方案1】:

您可以使用 dart 实现自己的流,如 docs 所示

这样,您还需要延迟,并且您将定期调用 API,但我想如果您的 API 在没有先调用它的情况下不发送任何消息,那么这就是要走的路。

Stream<Product> productsStream() async* {
  while (true) {
    await Future.delayed(Duration(milliseconds: 500));
    Product someProduct = getProductFromAPI();
    yield someProduct;
  }
}

对代码的一点解释:

  • 您需要一个循环来定期调用 API。不用担心无限循环,因为只有在构建调用它的 StreamBuild 时才会使用流。
  • yield 关键字在使用流时类似于 return

然后,要使用它,只需实现一个 StreamBuilder 调用您刚刚创建的 Stream

StreamBuilder(
    stream: productsStream(),
    builder: (BuildContext context, AsyncSnapshot<Product> snapshot) {...}
)

【讨论】:

  • 应用死机后还能用吗?表示应用已安装在手机中,但没有使用或在后台运行
  • @Mukta 不,以这种方式实现的流仅在构建小部件时更新。我不确定是否可以在后台运行时进行一些更改
猜你喜欢
  • 2021-12-31
  • 1970-01-01
  • 2019-06-06
  • 2020-08-19
  • 1970-01-01
  • 2021-06-13
  • 2021-10-17
  • 2021-10-03
  • 2021-06-03
相关资源
最近更新 更多