What is FutureBuilder in Flutter and how is it used to build dynamic UI?
#widget#async#futurebuilder
Answer
Overview
is a Flutter widget that builds itself based on the latest snapshot of a textFutureBuilder
text
FutureBasic Structure
dartFutureBuilder<DataType>( future: myFuture, // The Future to listen to builder: (context, snapshot) { // snapshot.connectionState — loading/done // snapshot.data — result when done // snapshot.error — error if failed }, )
Full Example
dartclass UserProfileScreen extends StatelessWidget { Future<User> fetchUser() async { final response = await http.get(Uri.parse('https://api.example.com/user/1')); return User.fromJson(jsonDecode(response.body)); } Widget build(BuildContext context) { return Scaffold( appBar: AppBar(title: Text('Profile')), body: FutureBuilder<User>( future: fetchUser(), builder: (context, snapshot) { // Loading state if (snapshot.connectionState == ConnectionState.waiting) { return Center(child: CircularProgressIndicator()); } // Error state if (snapshot.hasError) { return Center(child: Text('Error: ${snapshot.error}')); } // Success state if (snapshot.hasData) { final user = snapshot.data!; return Column( children: [ CircleAvatar(backgroundImage: NetworkImage(user.avatarUrl)), Text(user.name), Text(user.email), ], ); } return SizedBox.shrink(); }, ), ); } }
ConnectionState Values
| State | Meaning |
|---|---|
text | No Future provided |
text | Future is in progress |
text | Only for Streams |
text | Future is complete |
Avoid Rebuilding Future on Each Build
dartclass _MyState extends State<MyWidget> { late Future<User> _userFuture; void initState() { super.initState(); _userFuture = fetchUser(); // ✅ Store it — don't call in build() } Widget build(BuildContext context) { return FutureBuilder<User>( future: _userFuture, // ✅ Reuse same Future builder: (context, snapshot) { ... }, ); } }
⚠️ Never call
directly in build — it creates a new Future on each rebuild!textfuture: fetchUser()
FutureBuilder vs StreamBuilder
| Feature | FutureBuilder | StreamBuilder |
|---|---|---|
| Data type | text | text |
| Updates | Once when Future completes | Every time Stream emits |
| Use case | One-time API fetch | Real-time data (Firestore, WebSocket) |
Best Practice: Use
for one-time async data loads. For real-time updates, usetextFutureBuilder.textStreamBuilder