FutureBuilder — apa itu, bekerja dengan Future di Flutter

Penulis: IT Sectr Diterbitkan: 2026-07-02 Waktu membaca: 8 mnt

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 — widget Flutter untuk membangun UI berdasarkan status Future melalui AsyncSnapshot (none, waiting, active, done)
  • AsyncSnapshot — objek yang berisi status terkini operasi asinkron: connectionState, data, dan error
  • builder — fungsi callback yang dipanggil pada setiap perubahan status Future untuk membangun ulang UI
  • Penanganan error — AsyncSnapshot.hasError memungkinkan menampilkan antarmuka cadangan saat operasi asinkron gagal
  • ConnectionState — enum dengan empat nilai: none (tidak ada operasi), waiting (menunggu), active (stream), done (selesai)

Apa itu FutureBuilder di Flutter

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.

Bagaimana FutureBuilder bekerja di balik layar

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: status dan properti

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.

PropertiTipeDeskripsi
connectionStateConnectionStateStatus koneksi saat ini (none, waiting, active, done)
dataT?Data yang diterima dari Future (null hingga selesai atau saat error)
errorObject?Objek error jika Future selesai dengan pengecualian
hasDatabooltrue jika data tidak null dan status ConnectionState.done
hasErrorbooltrue jika Future selesai dengan error

ConnectionState: empat status operasi asinkron

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.

Pola penggunaan FutureBuilder

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.

Memuat data saat inisialisasi layar

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.

Memuat dengan cache dan penyegaran

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 vs setState: mana yang dipilih

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.

Contoh FutureBuilder dengan pemuatan data dari jaringan

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.

dart
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

Mengapa FutureBuilder memanggil builder beberapa kali?

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.

Bagaimana cara mencegah permintaan berulang saat pembangunan ulang?

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.

Apa perbedaan FutureBuilder dengan StreamBuilder?

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.

Bagaimana cara menggunakan FutureBuilder dengan beberapa Future?

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.

Bagaimana cara membatalkan Future saat keluar dari layar?

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

  • FutureBuilder — widget Flutter untuk membangun UI deklaratif berdasarkan status Future melalui AsyncSnapshot (waiting, done, error)
  • AsyncSnapshot — wadah dengan connectionState, data, dan error; wajib untuk penanganan yang benar dari semua status operasi asinkron
  • builder — callback dengan tiga cabang: hasError (menampilkan error), hasData (menampilkan data), default (indikator pemuatan)
  • FutureBuilder vs setState — FutureBuilder lebih sederhana untuk satu operasi, setState dengan Bloc/Riverpod lebih baik untuk logika kompleks dengan banyak permintaan
  • Mencegah permintaan berulang — Future harus menjadi bidang State, jangan membuatnya di metode build untuk menghindari mulai ulang setiap pembangunan ulang
  • Pembatalan Future — FutureBuilder tidak membatalkan Future saat dispose; gunakan CancelableOperation atau flag pembatalan untuk mencegah setState setelah penghancuran
  • Beberapa Future — untuk permintaan paralel gunakan Future.wait dengan satu FutureBuilder; untuk berurutan — rantai dalam satu Future

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.

Diskusikan proyek

Baca juga