Flutter
Future re-run
Use key and setState to re-run a Future.
Rerunning the Future
To rerun a FutureBuilder, you need to give it a new Future instance. By reassigning the _future variable inside setState, the FutureBuilder is rebuilt and the Future runs again.
void retry() {
setState(() {
_future = fetchData();
});
}
A new Future assignment retriggers the FutureBuilder.
key and setState
Using a key is another way to recreate the FutureBuilder. When the ValueKey changes on each attempt, the widget is rebuilt. But the most common method is assigning a new Future with setState.
FutureBuilder(
key: ValueKey(_attemptCount),
future: _future,
builder: ...,
)
When the key changes, the widget is fully recreated.
Exercise Trigger Future with a retry button
The veriGetir async method should wait 100 ms and return 'Yeniden yüklendi'. In Ekrani stateful widget, hold a _future field, call print('ekran açıldı') in initState and assign veriGetir() to _future. On button press, reassign _future with setState. Display snapshot.data ?? 'bekle' with FutureBuilder<String>.
Show example solution
import 'package:flutter/material.dart';
Future<String> veriGetir() async {
await Future.delayed(Duration(milliseconds: 100));
return 'Yeniden yüklendi';
}
class Ekrani extends StatefulWidget {
@override
_EkraniState createState() => _EkraniState();
}
class _EkraniState extends State<Ekrani> {
late Future<String> _future;
@override
void initState() {
super.initState();
print('ekran açıldı');
_future = veriGetir();
}
void yenidenDene() {
setState(() {
_future = veriGetir();
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: Center(
child: FutureBuilder<String>(
future: _future,
builder: (context, snapshot) {
return Text(snapshot.data ?? 'bekle');
},
),
),
floatingActionButton: FloatingActionButton(
onPressed: yenidenDene,
child: Icon(Icons.refresh),
),
);
}
}
void main() => runApp(MaterialApp(home: Ekrani()));
Test yourself
-
What is the correct way to rerun a FutureBuilder?
- Giving the same Future reference again
- Assigning a new Future inside setState
- Doing hot reload
- Closing and reopening the app
Show answer
Assigning a new Future inside setState — Assigning a new Future instance to _future inside setState retriggers the FutureBuilder and reruns the Future.
-
Reassign the Future with setState
void yenidenDene() {
setState(() {
_future = ____();
});
}
Show answer
void yenidenDene() {
setState(() {
_future = veriGetir();
});
}
-
Future rerun parts
- setState
- Block where reassignment happens
- yeni Future
- Assignment triggering FutureBuilder
- ValueKey
- Key to recreate the widget
- _future değişkeni
- State field being reassigned
Next lesson: Summary - FutureBuilder