Flutter: ValueListenableBuilder

Cara menggunakan widget ValueListenableBuilder

Yudi Setiawan
Nusanet Developers
9 min readJan 30, 2022

--

Pengenalan

Di Flutter untuk mengubah state sebuah halaman kita bisa menggunakan setState. Selain setState, kita juga bisa menggunakan state management agar kode kita lebih rapi dan gampang dibaca. Walaupun penggunaan setState bisa dikatakan cukup mudah namun, jika kita salah dalam menggunakannya bisa-bisa performance app kita jadi jelek loh. Misalnya nih, kita mau mengubah widget Time yang ada di halaman Home. Let say widget Time ini nantinya kita mau buat realtime dimana setiap detik gitu jamnya berubah dengan format HH:mm:ss. Niat kita hanya ingin mengubah widget Time saja tapi, karena kita tidak tahu cara menggunakan setState yang baik. Alhasil kita langsung panggil saja tuh setState di halaman Home yang mana dampaknya adalah semua widget yang ada di halaman Home akan ter-build ulang. Terus pertanyaannya gimana caranya agar kita hanya bisa build ulang widget Time-nya saja? Sebenarnya ada banyak tekniknya namun, di tulisan kali ini saya akan contohkan caranya menggunakan widget ValueListenableBuilder.

Design

Biar pembahasan kali ini lebih menarik saya mau sekalian cari referensi design UI yang mau kita jadikan bahan di tulisan ini. Jadi, untuk referensi design-nya saya ada ambil dari dribbble ya.

Untuk design-nya nanti kita cuma akan pakai yang bagian ini aja ya.

Referensi design

Pembuatan Projek

Buat Projek

Untuk langkah pertamanya, silakan kita buat projek Flutter baru dengan nama flutter_mobile_attendance.

Buat Projek

Persiapan Aset

Sebelum kita mulai membuatnya. Kita memerlukan aset foto profil. Untuk foto profilnya bebas mau pakai yang mana ya. Tapi, kali ini saya akan pakai salah satu foto dari website pexels.com. Setelah kita unduh fotonya kemudian, kita masukkan foto tersebut kedalam projek kedalam directory assets.

Persiapan Aset

Selanjutnya, kita daftarkan directory assets kedalam file pubspec.yaml. Dan kita juga ada pakai plugin intl.

Selanjutnya, kita jalankan perintah flutter pub get.

Buat Kerangka UI

Sekarang kita buka file main.dart dan ubah kode didalamnya menjadi seperti berikut.

Nah, jadi kode diatas adalah kerangka dari UI yang akan kita buat.

Buat Widget Header

Sekarang kita akan coba membuat widget bagian header-nya dimana, dibagian tersebut kita akan menampilkan nama dan foto profil si pengguna.

Silakan kita ubah kode berikut.

Menjadi seperti berikut.

Jika dijalankan maka, outputnya akan menjadi seperti berikut.

Buat Widget Header

Buat Widget Date Time

Langkah selanjutnya adalah kita akan membuat widget yang menampilkan jam dan tanggal saat ini. Untuk membuatnya, silakan ubah kode berikut.

Menjadi seperti berikut.

Buat Widget Date Time

Jadi, untuk sementara widget date time-nya belum kita buat realtime. Kita fokus buat UI-nya dulu ya.

Buat Widget Button Presence

Nah, di langkah berikutnya kita akan membuat widget button presence. Silakan kita ubah kode berikut.

Menjadi seperti berikut.

Buat Widget Button Presence

Buat Widget History Presence

Langkah selanjutnya kita akan membuat widget history presence. Silakan ubah kode berikut.

Menjadi seperti berikut.

Buat Widget History Presence

Buat Widget Menu

Nah, ini widget terakhir yang akan kita buat. Untuk membuatnya, silakan ubah kode berikut.

Menjadi seperti berikut.

Buat Widget Menu

Bisa kita lihat sekarang bahwa UI-nya sudah selesai kita buat. Namun, kalau diperhatikan di sini masih ada yang kurang ya. Yaitu, kita mau widget date time-nya itu jalan atau dibuat realtime.

Buat Widget Date Time menjadi Realtime

Oke, sekarang akan kita buat ya. Tapi, sebelum kita buat. Saya mau tunjukkan dulu bahwa untuk membuatnya saya akan tunjukkan dengan 2 cara yaitu, cara pertama dengan menggunakan setState dan cara kedua menggunakan widget ValueListenableBuilder. Sengaja saya tunjukkan biar kita semua tahu mana yang lebih praktis dan efisien dalam penggunaannya untuk kasus seperti ini.

Menggunakan setState

Nah, untuk cara pertama kita akan coba menggunakan setState. Caranya, silakan kita update kode didalam file main.dart dan kita perlu override function initState dan dispose menjadi seperti berikut.

Kemudian, untuk membuktikan bahwa method build benar-benar ter-build ulang ketika timer-nya jalan kita perlu tambahkan kode berikut didalam method build .

Sekarang kalau kita jalankan programnya maka, kita sudah bisa lihat bahwa widget date time-nya sudah berjalan secara realtime.

Membuat Widget Date Time Realtime Menggunakan setState

Tapi, kalau kita perhatikan kodenya. Cara pertama kuranglah efisien. Mengapa berani saya katakan kurang efisien? Karena, ketika kita menggunakan setState maka, tanpa kita sadari bahwa semua widget yang ada didalam method build akan terbuat ulang semuanya. Dan ini kurang efektif mengingat kembali bahwa tujuan diawalnya kita hanya mau meng-update state dari widget Date Time saja. Widget yang lain tidak perlu diupdate. Memang di contoh kasus kali ini kita tidak melihat secara langsung efeknya tapi, kalau UI-nya sudah cukup kompleks maka, itu akan sangat kelihatan sekali bahwa jank atau freeze-nya terjadi. Jadi, untuk cara pertama ini kurang efektif ya.

Menggunakan Widget ValueListenableBuilder

Oke sekarang kita coba cara kedua ya. Untuk cara kedua kita akan menggunakan widget yang bernama ValueListenableBuilder . Jadi, kalau kita baca-baca secara singkat dokumentasinya. Disebutkan bahwa widget ini berfungsi untuk build ulang widget yang ada didalamnya ketika nilai yang kita berikan berubah. Agak susah dimengerti ya? Oke, jadi bahasa gampangnya adalah widget ini hanya ter-build ulang kalau nilai didalamnya juga berubah.

Biar lebih gampang. Akan saya tunjukkan gimana cara buatnya. Pertama-tama kita hapus dulu tuh perintah setState yang ada didalam method initState. Sekaligus hapus variable yang bernama now.

Kemudian, kita perlu buat 1 variable global dengan nama valueNotifierNow. Dan kita inisialisasikan nilainya didalam method initState.

Untuk saat ini kita akan melihat bahwa kode kita mengalami error tapi, it’s okay. Kita abaikan dulu ya. Sekarang kita ubah kode bagian ini.

Menjadi seperti ini.

Lalu, kita tambahkan parameter didalam method buildWidgetDateTime .

Sekarang coba kita jalankan lagi app-nya maka, outputnya akan sama yaitu, waktu akan berjalan secara realtime. Mungkin kalau cuma dari UI-nya saja kita tidak percaya ya kalau yang ter-build ulang hanyalah method buildWidgetDateTime. Untuk membuktikannya silakan kita tambahkan kode print berikut didalam method buildWidgetDateTime .

Sekarang coba kita jalankan programnya dan buka DevTools untuk melihat output di console-nya apakah yang ter-build hanya method buildWidgetDateTime saja atau method build juga ikut ter-build.

Membuat Widget Date Time Realtime Menggunakan widget ValueListenableBuilder

Nah, lihat kan perbedaannya? Kalau pakai widget ValueListenableBuilder maka, yang ter-build hanyalah method buildWidgetDateTime-nya saja.

Kesimpulan

Jadi, di tulisan ini kita telah mempelajari mengenai penggunaan widget ValueListenableBuilder. Jadi, widget ValueListenableBuilder ini berfungsi untuk membuat widget yang kita inginkan hanya ter-build ulang jika nilai yang diberikan berubah. Jadi, lebih efektif daripada setState jikalau kita hanya ingin mem-build ulang widget tertentu. Untuk source code lengkapnya bisa dicek di Github ya 😉.

--

--