FutureBuilder — adalah widget di Flutter yang secara otomatis membangun ulang antarmukanya berdasarkan status terkini AsyncSnapshot yang diperoleh dari Future yang diberikan. Tidak seperti pemanggilan manual setState setelah await, FutureBuilder menyediakan pendekatan deklaratif: ia berlangganan ke Future pada render pertama dan memanggil fungsi builder pada setiap perubahan status — memuat, error, atau data siap. Menurut Flutter API Reference (2026), FutureBuilder sangat berguna untuk memuat data dari jaringan, membaca dari database, dan operasi asinkron apa pun di mana UI perlu menampilkan indikator pemuatan, pesan error, atau konten siap.
Poin Utama
FutureBuilder — adalah widget bawaan Flutter dari paket widgets yang menerima Future<T> dan fungsi builder. Ketika status Future berubah (sedang berjalan, selesai dengan data, selesai dengan error) FutureBuilder secara otomatis membangun ulang UI dengan memanggil builder dengan AsyncSnapshot baru. Ini menghilangkan kebutuhan untuk mengelola status pemuatan secara manual melalui setState dan flag.
Tidak seperti StreamBuilder yang bekerja dengan aliran data (Stream), FutureBuilder dirancang untuk operasi asinkron satu kali: permintaan HTTP, membaca dari file, kueri database. FutureBuilder mengelola sendiri langganan ke Future: pada pembangunan pertama ia menjalankan Future dan melacak penyelesaiannya. Saat widget dihancurkan, FutureBuilder tidak membatalkan Future — ini adalah tanggung jawab pengembang.
Menurut Flutter Cookbook (2026), FutureBuilder direkomendasikan untuk kasus di mana operasi asinkron dijalankan sekali saat inisialisasi layar. Untuk operasi berulang atau aliran data, gunakan StreamBuilder. Kedua widget mengikuti pola Reactive UI yang sama, tetapi FutureBuilder dioptimalkan untuk permintaan satu kali.
Implementasi internal FutureBuilder berlangganan ke Future melalui Future.then dan catchError. Saat dimulai, FutureBuilder mengatur connectionState ke ConnectionState.waiting dan memanggil builder dengan data kosong. Saat berhasil, connectionState berubah menjadi ConnectionState.done dengan data. Saat error, snapshot.error diisi dengan objek error. Setiap perubahan memicu pembangunan ulang widget.
AsyncSnapshot — adalah objek wadah yang diteruskan FutureBuilder ke fungsi builder pada setiap perubahan status. Ini berisi semua informasi tentang status terkini operasi asinkron: apakah pemuatan sedang berlangsung, data apa yang diterima, apakah terjadi error. Memahami AsyncSnapshot adalah kunci untuk membangun UI dengan FutureBuilder dengan benar.
| Properti | Tipe | Deskripsi |
|---|---|---|
| connectionState | ConnectionState | Status koneksi saat ini (none, waiting, active, done) |
| data | T? | Data yang diterima dari Future (null hingga selesai atau saat error) |
| error | Object? | Objek error jika Future selesai dengan pengecualian |
| hasData | bool | true jika data tidak null dan status ConnectionState.done |
| hasError | bool | true jika Future selesai dengan error |
Enum ConnectionState menentukan tahap operasi asinkron. None — status awal ketika Future belum dijalankan (jarang digunakan, biasanya saat pembangunan pertama tanpa initialData). Waiting — Future sedang berjalan, data belum diterima. Active — hanya digunakan oleh StreamBuilder untuk stream dengan data parsial. Done — Future selesai, data tersedia melalui snapshot.data atau error melalui snapshot.error.
Penanganan yang benar dari semua status AsyncSnapshot dalam fungsi builder adalah persyaratan wajib untuk kode produksi. Jika Anda tidak menangani status waiting, pengguna akan melihat layar kosong selama pemuatan. Jika Anda tidak menangani hasError, pengguna akan mendapatkan Exception tanpa penjelasan. Pola yang direkomendasikan: periksa hasError → periksa hasData → default tampilkan pemuatan.
FutureBuilder dapat digunakan dalam beberapa pola standar, masing-masing memecahkan tugas tertentu. Mari kita lihat skenario utama: memuat data saat inisialisasi, memuat dengan cache, permintaan paralel, dan penanganan error dengan pengulangan.
Pola paling umum — FutureBuilder dalam metode build StatefulWidget atau StatelessWidget. Future diteruskan dari initState atau dibuat langsung di build. Penting untuk tidak membuat Future dalam metode build setiap kali pembangunan ulang — ini menyebabkan permintaan berulang. Gunakan Future yang disimpan di bidang State.
Untuk mencegah permintaan berulang, FutureBuilder dapat dikombinasikan dengan CachedNetworkImage atau cache lokal. Setelah pemuatan pertama, data disimpan di memori atau SharedPreferences, dan FutureBuilder menampilkan data cache secara instan, sambil memperbaruinya secara paralel dari jaringan. Ini meningkatkan UX dengan respons instan.
Menurut pub.dev (2026), caching sangat relevan untuk gambar dan daftar data. FutureBuilder dengan CachedNetworkImageProvider secara otomatis menampilkan gambar yang di-cache, dan jika tidak ada — indikator pemuatan dengan tampilan file yang diunduh selanjutnya.
FutureBuilder dan manajemen status manual melalui setState — dua pendekatan untuk UI asinkron di Flutter. Masing-masing memiliki kelebihan dan keterbatasan. Pilihan tergantung pada kompleksitas layar dan jumlah operasi asinkron.
FutureBuilder unggul dalam kesederhanaan: tidak perlu mendeklarasikan bidang untuk status pemuatan, data, dan error — semuanya dikelola melalui AsyncSnapshot. Ini ideal untuk layar sederhana dengan satu operasi asinkron (satu permintaan HTTP, membaca database). Namun, dengan 5+ operasi asinkron pada satu layar, FutureBuilder menciptakan sarang yang berlebihan — terbentuk “piramida” dari FutureBuilder bersarang.
setState dengan flag status manual memberikan lebih banyak kontrol dan keterbacaan dalam logika kompleks. Untuk layar dengan banyak permintaan dependen (memuat pengguna → memuat pesanannya → memuat detail pesanan) lebih baik menggunakan setState dengan ChangeNotifier atau Bloc. Menurut Flutter State Management Guide (2026), untuk skenario kompleks disarankan menggunakan Riverpod atau Bloc daripada FutureBuilder, karena mereka memberikan pemisahan logika dan presentasi yang lebih baik.
Mari kita lihat contoh praktis FutureBuilder untuk memuat daftar pengguna dari REST API. Kode ini mendemonstrasikan penanganan yang benar dari ketiga status AsyncSnapshot: pemuatan, error, dan data siap.
class UserListPage extends StatefulWidget {
const UserListPage({super.key});
@override
State<UserListPage> createState() => _UserListPageState();
}
class _UserListPageState extends State<UserListPage> {
final Future<List<User>> usersFuture = UserRepository().fetchUsers();
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: const Text('Users')),
body: FutureBuilder<List<User>>(
future: usersFuture,
builder: (context, AsyncSnapshot<List<User>> snapshot) {
if (snapshot.hasError) {
return Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
const Icon(Icons.error_outline, size: 48, color: Colors.red),
const SizedBox(height: 16),
Text('Error: ${snapshot.error}'),
],
),
);
}
if (snapshot.hasData) {
final users = snapshot.data!;
return ListView.builder(
itemCount: users.length,
itemBuilder: (context, index) {
return ListTile(
leading: CircleAvatar(backgroundImage: NetworkImage(users[index].avatarUrl)),
title: Text(users[index].name),
subtitle: Text(users[index].email),
);
},
);
}
return const Center(child: CircularProgressIndicator());
},
),
);
}
}
Dalam contoh, FutureBuilder menangani ketiga status. Saat error, ikon dengan pesan error ditampilkan. Saat berhasil dimuat — ListView dengan avatar dan nama. Selama pemuatan — CircularProgressIndicator. Future dideklarasikan sebagai bidang kelas, yang mencegah pemanggilan ulang saat pembangunan ulang. Pola ini mencakup 90% skenario penggunaan FutureBuilder dalam aplikasi seluler.
Pertanyaan yang Sering Diajukan
FutureBuilder memanggil builder pada setiap perubahan status Future: pertama kali saat pembuatan (connectionState: none atau waiting), kedua kali saat penyelesaian (connectionState: done). Jika widget induk dibangun ulang, FutureBuilder juga dibangun ulang. Untuk mencegah panggilan berulang, pastikan Future dibuat di luar metode build — jika tidak, setiap panggilan build membuat Future baru.
Simpan Future di bidang StatefulWidget (di initState) atau gunakan memoization. Jika Future dibuat di dalam metode build, setiap panggilan build akan membuat Future baru, dan FutureBuilder akan memulai ulang operasi asinkron. Untuk StatelessWidget, gunakan paket cached_future atau widget keep-alive agar Future dijalankan sekali terlepas dari pembangunan ulang.
FutureBuilder dirancang untuk operasi asinkron satu kali (satu permintaan HTTP, satu pembacaan database). StreamBuilder bekerja dengan aliran data yang dapat memancarkan banyak nilai dari waktu ke waktu (chat, pembaruan harga, geolokasi). StreamBuilder mendukung ConnectionState.active untuk data parsial, sementara FutureBuilder hanya mendukung waiting dan done.
Untuk beberapa Future paralel, gunakan Future.wait dan berikan hasilnya ke satu FutureBuilder. Future.wait menerima daftar Future dan mengembalikan Future<List> — ketika semua Future selesai, builder menerima array hasil. Untuk permintaan berurutan, gunakan rantai Future.then dalam satu Future atau FutureBuilder bersarang (kurang terbaca). Alternatif — paket riverpod dengan AsyncValue untuk beberapa status asinkron.
FutureBuilder tidak membatalkan Future secara otomatis. Untuk pembatalan, gunakan CancelableOperation dari paket async atau mekanisme sendiri melalui flag cancelled di State. Di dispose() atur flag, dan setelah Future selesai periksa sebelum memanggil setState. Alternatif, gunakan paket riverpod dengan AutoDispose yang secara otomatis membatalkan operasi asinkron saat keluar dari layar.
Kesimpulan
Kami akan mengembangkan aplikasi seluler turnkey
IT Sectr membuat aplikasi iOS dan Android untuk startup dan bisnis sejak 2017. Kami akan memberi saran dan mengusulkan solusi terbaik.
Baca juga