flutter - 来自 REST API 的实时流数据

Edd*_*dyG 6 dart flutter

我正在使用流从 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) {...}
Run Code Online (Sandbox Code Playgroud)

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

Timer.periodic(Duration(seconds: 1), (_) => loadDetails());
Run Code Online (Sandbox Code Playgroud)

来源:来自 Flutter 中 PHP 的 API Stream(不是 Firebase)

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

有没有一种有效的方法可以使流反映应用程序中的数据更改而无需重新加载数据?

jsg*_*aga 16

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

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

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

代码的一点解释:

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

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

StreamBuilder(
    stream: productsStream(),
    builder: (BuildContext context, AsyncSnapshot<Product> snapshot) {...}
)
Run Code Online (Sandbox Code Playgroud)