flutter - realtime stream data from REST API

Viewed 11239

I am retrieving data from a REST API using a stream, but when the data updates in the database the stream does not refresh the data in the app.

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) {...}

I saw a solution proposing to periodically re-load the data from the API, for example each 1 second.

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

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

I do not think it is an efficient approach. In my app for example, I want to integrate the data changes without re-loading the data.

Is there an efficient way to make the stream reflects data changes in the app without reloading data?

1 Answers

You can implement your own stream with dart as shown in the docs

With this, you will also need a delay and you will be making calls to the API periodically, but I guess that's the way to go if your API does not send any message without calling it first.

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

A little explanation of the code:

  • You need a loop to call the API periodically. Don't worry about infinite loops, since the stream will only be used while the StreamBuild that calls it is built.
  • The yield keyword is like the return when using streams

Then, to use it, just implement a StreamBuilder calling the Stream you just created:

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