I want to fetch data from api every x seconds to display data as live in widget and I also want to animate widget when data is change.I tried with Stream and Stream Builder.Which is the best way to fetch data as live.Please help me.
Here is my code.
class Post{
final String title;
Post({this.title});
factory Post.fromJson(Map<String, dynamic> json) {
return Post(
no: json['title']
);
}
}
class PostData {
static String _url="https://jsonplaceholder.typicode.com/posts/1";
static Future browse () async {
http.Response response = await http.get(_url);
Post post= Post.fromJson(json.decode(response.body));
return post;
}
Stream<int> get getLiveData async* {
yield await PostData.browse();
}
StreamBuilder<Post>(
stream: getLiveData,
builder: (context, snapshot) {
return Text(snapshot.data.title)
},
)
Execute Periodically in Flutterperiodic(Duration(seconds: 1), (timer) { setState(() { greeting = "After Some time ${DateTime. now(). second}"; }); }); This will set the value to the greeting variable in every 1 second.
Creating a simple timer Now, to create a simple 3-second timer, add the following, which triggers a callback after it executes: final timer = Timer( const Duration(seconds: 3), () { // Navigate to your favorite place }, ); Once the callback triggers, we can navigate a user to a new screen, for example.
You should take a look at Timer.Periodic https://api.flutter.dev/flutter/dart-async/Timer/Timer.periodic.html I am using it with setState, but I'm sure it's also possible with a Stream.
EDIT: Something like this, using Stream.periodic:
Stream <int> getPeriodicStream() async* {
yield* Stream.periodic(Duration(seconds: 30), (_) {
return PostData.browse();
}).asyncMap((value) async => await value,
);
}
You probably also need to do this only while the app is in foreground (to prevent unnecessary battery usage). You can use my LifecycleAwareStreamBuilder, there is an example on how to use it here
Link directly to the gist
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