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?
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:
StreamBuild that calls it is built.yield keyword is like the return when using streamsThen, to use it, just implement a StreamBuilder calling the Stream you just created:
StreamBuilder(
stream: productsStream(),
builder: (BuildContext context, AsyncSnapshot<Product> snapshot) {...}
)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With