Terakhir diperbarui: 21 November 2024
Penulis: Habibie Ed Dien
Pada codelab ini, Anda akan mempelajari tentang streams dan BLoC di Flutter beserta contoh penggunaannya. Cara kerja, manfaat, dan cara mengelola state lebih lanjut.
Video berikut menjelaskan tentang apa itu Streams dan BLoC serta bagaimana manfaatnya terhadap pengelolaan state. Silakan simak dan pahami!
Setelah menyelesaikan codelab ini Anda akan mampu untuk:
Berikut merupakan sumber daya yang diperlukan untuk menyelesaikan praktikum ini:
Di Dart dan Flutter, future dan stream merupakan tool utama untuk melakukan pemrograman asynchronous. Future merepresentasikan single value yang diterima di waktu yang akan datang, sedangkan Stream adalah sebuah set (sequence) yang bisa memiliki nilai 0 atau lainnya dikirim secara asinkronus secara terus-menerus. Intinya, Stream merupakan aliran data yang dikirim terus-menerus.
Untuk mendapatkan data dari Stream, Anda harus melakukan subscribe (listen). Setiap kali data itu diterima, Anda mendapatkan data tersebut dan dapat dimanipulasi sesuai kebutuhan aplikasi.
Pada codelab ini, Anda akan fokus bekerja dengan berbagai studi kasus pada stream di Flutter. Anda akan menggunakan stream dengan berbagai skenario berbeda, cara menulis dan membaca data ke stream, membangun UI berdasarkan stream, dan menggunakan pola BLoC untuk state management.
Seperti halnya Future, stream juga dapat menghasilkan data atau error, sehingga Anda akan melakukan praktikum seperti halnya Future di pekan lalu.
Selesaikan langkah-langkah praktikum berikut ini menggunakan editor Visual Studio Code (VS Code) atau Android Studio atau code editor lain kesukaan Anda. Jawablah di laporan praktikum Anda (ketik di README.md) pada setiap soal yang ada di beberapa langkah praktikum ini.
Buatlah sebuah project flutter baru dengan nama stream_nama (beri nama panggilan Anda) di folder week-12/src/ repository GitHub Anda.
main.dartKetiklah kode seperti berikut ini.


stream.dartBuat file baru di folder lib project Anda. Lalu isi dengan kode berikut.

colorsTambahkan variabel di dalam class ColorStream seperti berikut.

getColors()Di dalam class ColorStream ketik method seperti kode berikut. Perhatikan tanda bintang di akhir keyword async* (ini digunakan untuk melakukan Stream data)

yield*Tambahkan kode berikut ini.
yield* Stream.periodic(
const Duration(seconds: 1), (int t) {
int index = t % colors.length;
return colors[index];
});
main.dartKetik kode impor file ini pada file main.dart
import 'stream.dart';
Ketik dua properti ini di dalam class _StreamHomePageState

changeColor()Tetap di file main, Ketik kode seperti berikut

initState()Ketika kode seperti berikut

Scaffold()Sesuaikan kode seperti berikut.

Lakukan running pada aplikasi Flutter Anda, maka akan terlihat berubah warna background setiap detik.

changeColor()Anda boleh comment atau hapus kode sebelumnya, lalu ketika kode seperti berikut.

StreamControllers akan membuat jembatan antara Stream dan Sink. Stream berisi data secara sekuensial yang dapat diterima oleh subscriber manapun, sedangkan Sink digunakan untuk mengisi (injeksi) data.
Secara sederhana, StreamControllers merupakan stream management. Ia akan otomatis membuat stream dan sink serta beberapa method untuk melakukan kontrol terhadap event dan fitur-fitur yang ada di dalamnya.
Anda dapat membayangkan stream sebagai pipa air yang mengalir searah, dari salah satu ujung Anda dapat mengisi data dan dari ujung lain data itu keluar. Anda dapat melihat konsep stream pada gambar diagram berikut ini.

Di Flutter, Anda dapat menggunakan StreamController untuk mengontrol aliran data stream. Sebuah StreamController memiliki sebuah properti bernama sink yang berguna untuk insert data. Sedangkan properti stream berguna untuk menerima atau keluarnya data dari StreamController tersebut.
Setelah Anda menyelesaikan praktikum 1, Anda dapat melanjutkan praktikum 2 ini. Selesaikan langkah-langkah praktikum berikut ini menggunakan editor Visual Studio Code (VS Code) atau Android Studio atau code editor lain kesukaan Anda. Jawablah di laporan praktikum Anda pada setiap soal yang ada di beberapa langkah praktikum ini.
Pada codelab ini, kita akan menambah kode dari aplikasi stream di praktikum sebelumnya.
stream.dartLakukan impor dengan mengetik kode ini.
import 'dart:async';
class NumberStreamTetap di file stream.dart tambah class baru seperti berikut.

StreamControllerDi dalam class NumberStream buatlah variabel seperti berikut.

addNumberToSinkTetap di class NumberStream buatlah method ini

close()
main.dartKetik kode import seperti berikut

Di dalam class _StreamHomePageState ketik variabel berikut

initState()

addRandomNumber()void addRandomNumber() {
Random random = Random();
int myNum = random.nextInt(10);
numberStream.addNumberToSink(myNum);
}
build()
Lakukan running pada aplikasi Flutter Anda, maka akan terlihat seperti gambar berikut.

stream.dartTambahkan method berikut ini.

Tambahkan method onError di dalam class StreamHomePageState pada method listen di fungsi initState() seperti berikut ini.

addRandomNumber()Lakukan comment pada dua baris kode berikut, lalu ketik kode seperti berikut ini.

Skenario yang umum dilakukan adalah melakukan manipulasi atau transformasi data stream sebelum sampai pada UI end user. Hal ini sangatlah berguna ketika Anda membutuhkan untuk filter data berdasarkan kondisi tertentu, melakukan validasi data, memodifikasinya, atau melakukan proses lain yang memicu beberapa output baru. Contohnya melakukan konversi angka ke string, membuat sebuah perhitungan, atau menghilangkan data yang berulang terus tampil.
Pada praktikum 3 ini, Anda akan menggunakan StreamTransformers ke dalam stream untuk melakukan map dan filter data.
Setelah Anda menyelesaikan praktikum 2, Anda dapat melanjutkan praktikum 3 ini. Selesaikan langkah-langkah praktikum berikut ini menggunakan editor Visual Studio Code (VS Code) atau Android Studio atau code editor lain kesukaan Anda. Jawablah di laporan praktikum Anda pada setiap soal yang ada di beberapa langkah praktikum ini.
main.dartTambahkan variabel baru di dalam class _StreamHomePageState

initState
initStateLakukan edit seperti kode berikut.

Terakhir, run atau tekan F5 untuk melihat hasilnya jika memang belum running. Bisa juga lakukan hot restart jika aplikasi sudah running. Maka hasilnya akan seperti gambar berikut ini. Anda akan melihat tampilan angka dari 0 hingga 90.

Dari praktikum sebelumnya, Anda telah menggunakan method listen mendapatkan nilai dari stream. Ini akan menghasilkan sebuah Subscription. Subscription berisi method yang dapat digunakan untuk melakukan listen pada suatu event dari stream secara terstruktur.
Pada praktikum 4 ini, kita akan gunakan Subscription untuk menangani event dan error dengan teknik praktik baik (best practice), dan menutup Subscription tersebut.
Setelah Anda menyelesaikan praktikum 3, Anda dapat melanjutkan praktikum 4 ini. Selesaikan langkah-langkah praktikum berikut ini menggunakan editor Visual Studio Code (VS Code) atau Android Studio atau code editor lain kesukaan Anda. Jawablah di laporan praktikum Anda pada setiap soal yang ada di beberapa langkah praktikum ini.
Tambahkan variabel berikut di class _StreamHomePageState

initState()Edit kode seperti berikut ini.

initState()Tambahkan kode berikut ini.

Tambahkan dibawahnya kode ini setelah onError

Ketik method ini di dalam class _StreamHomePageState

dispose()Jika method dispose() belum ada, Anda dapat mengetiknya dan dibuat override. Ketik kode ini didalamnya.

build()Tambahkan button kedua dengan isi kode seperti berikut ini.

addRandomNumber()Edit kode seperti berikut ini.

Anda akan melihat dua button seperti gambar berikut.

Anda akan melihat pesan di Debug Console seperti berikut.

Secara default, stream hanya bisa digunakan untuk satu subscription. Jika Anda mencoba untuk melakukan subscription yang sama lebih dari satu, maka akan terjadi error. Untuk menangani hal itu, tersedia broadcast stream yang dapat digunakan untuk multiple subscriptions. Pada praktikum ini, Anda akan mencoba untuk melakukan multiple stream subscriptions.
Setelah Anda menyelesaikan praktikum 4, Anda dapat melanjutkan praktikum 5 ini. Selesaikan langkah-langkah praktikum berikut ini menggunakan editor Visual Studio Code (VS Code) atau Android Studio atau code editor lain kesukaan Anda. Jawablah di laporan praktikum Anda pada setiap soal yang ada di beberapa langkah praktikum ini.
main.dartKetik variabel berikut di class _StreamHomePageState

initState()Ketik kode seperti berikut.

Lakukan run maka akan tampil error seperti gambar berikut.

Ketik kode seperti berikut di method initState()

build()Tambahkan text seperti berikut

Tekan button ‘New Random Number' beberapa kali, maka akan tampil teks angka terus bertambah sebanyak dua kali.

StreamBuilder adalah sebuah widget untuk melakukan listen terhadap event dari stream. Ketika sebuah event terkirim, maka akan dibangun ulang semua turunannya. Seperti halnya widget FutureBuilder pada pertemuan pekan lalu, StreamBuilder berguna untuk membangun UI secara reaktif yang diperbarui setiap data baru tersedia.
Setelah Anda menyelesaikan praktikum 5, Anda dapat melanjutkan praktikum 6 ini. Selesaikan langkah-langkah praktikum berikut ini menggunakan editor Visual Studio Code (VS Code) atau Android Studio atau code editor lain kesukaan Anda. Jawablah di laporan praktikum Anda pada setiap soal yang ada di beberapa langkah praktikum ini.
Buatlah sebuah project flutter baru dengan nama streambuilder_nama (beri nama panggilan Anda) di folder week-12/src/ repository GitHub Anda.
stream.dartKetik kode ini

stream.dartKetik kode seperti berikut.

Ketik kode seperti berikut ini.



Di dalam class _StreamHomePageState, ketika variabel ini.

initState()Ketik kode seperti berikut.

build()

Hasilnya, setiap detik akan tampil angka baru seperti berikut.

Ketika menggunakan pola BLoC, maka segalanya merupakan stream event. BLoC atau Business Logic Component adalah lapisan antara semua sumber data dan UI yang mengonsumsi data itu. Contohnya seperti sumber data dari HTTP layanan web servis atau JSON dari sebuah basis data.
Sebuah BLoC menerima stream data dari sumbernya, proses itu membutuhkan logika bisnis Anda, dan return stream data ke subscriber-nya. Perhatikan diagram pola kerja BLoC berikut ini.

Alasan utama menggunakan BLoC adalah memisahkan logika bisnis aplikasi dengan presentasi UI pada widget, terutama akan sangat berguna ketika aplikasi Anda mulai semakin kompleks dan membutuhkan akses state di berbagai tempat. Hal ini akan membuat semakin mudah dalam menggunakan kode Anda, pada beberapa bagian di aplikasi atau bahkan berbeda aplikasi. Selain itu, BLoC secara independen berdiri sendiri dengan UI, sehingga sangat mudah dilakukan isolasi dalam proses testing.
Pada praktikum codelab ini, Anda akan membuat aplikasi sederhana menggunakan BLoC, namun Anda dapat dengan mudah mengembangkannya untuk aplikasi yang lebih besar ruang lingkupnya.
Setelah Anda menyelesaikan praktikum 6, Anda dapat melanjutkan praktikum 7 ini. Selesaikan langkah-langkah praktikum berikut ini menggunakan editor Visual Studio Code (VS Code) atau Android Studio atau code editor lain kesukaan Anda. Jawablah di laporan praktikum Anda pada setiap soal yang ada di beberapa langkah praktikum ini.
Buatlah sebuah project flutter baru dengan nama bloc_random_nama (beri nama panggilan Anda) di folder week-12/src/ repository GitHub Anda. Lalu buat file baru di folder lib dengan nama random_bloc.dart
random_bloc.dartKetik kode impor berikut ini.

class RandomNumberBloc()
StreamControllerDi dalam class RandomNumberBloc() ketik variabel berikut ini


dispose()
main.dart
random_screen.dartDi dalam folder lib project Anda, buatlah file baru ini.
random_bloc.dartKetik kode ini di file baru random_screen.dart

Buatlah di dalam file random_screen.dart
Ketik kode ini di dalam class _RandomScreenState

dispose()Ketik kode ini di dalam class _StreamHomePageState

build()Ketik kode ini di dalam class _StreamHomePageState

Run aplikasi, maka Anda akan melihat angka acak antara angka 0 sampai 9 setiap kali menekan tombol FloactingActionButton.
Selamat Anda telah menyelesaikan Codelab ini. Anda telah mempelajari terkait stream, BLoC dan contoh penggunaannya.
Pada codelab berikutnya, Anda akan mempelajari tentang Persistensi Data.
Jangan sungkan jika Anda menemukan kesalahan pada codelab ini untuk merevisi atau sekedar melaporkan issue melalui tautan di pojok kiri bawah (Report a mistake).
Silakan cek beberapa sumber belajar lainnya...