Posts

Mengenal Stream, async*, yield, dan yield* pada Flutter

Bismillah, pada postingan kali ini saya akan menjelaskan beberapa hal tentang konsep pemrograman asinkron pada Flutter

Asinkron sederhananya adalah apabila kita punya beberapa baris program maka baris program yang menggunakan asinkron akan dijalankan lalu langsung dilewati tanpa peduli kode asinkron tersebut sudah selesai dieksekusi atau belum, ini biasanya digunakan untuk proses yang memakan waktu yang tidak diketahui kapan selesainya, seperti mengakses API yang tergantung dengan kecepatan koneksi internet, saat mendownload, dan lain-lain.

Pada flutter kita bisa menggunakan teknik asinkron dengan menggunakan package async yang telah menjadi bawaan pada flutter.

import 'dart:async';

Untuk membuat fungsi asinkron, kita bisa menggunakan Future atau Stream, penggunaan dua hal tersebut sangat berkaitan dengan async, async*, yield, dan yield*.

Untuk itu maka kita perlu mengenali apa itu async, async*, yield, dan yield*

Namun kali ini kita akan membahas bagian Streamnya, dan juga membahas perbedaan mendasar antara menggunakan Stream dan Future.

penggunaan async* digunakan apabila kita menggunakan Stream, sedangkan async berguna saat kita menggunakan Future

// asinkron menggunakan Future
Future getNumber() async {
  return 10;
}
// menggunakan Strem
Stream<int> methodName() async* {
  yield 1;
  yield 2;
  yield 3;
}

kita bisa lihat contoh kode diatas, dimana kita bisa mengetahui perbedaan keduanya.

Pada Future kita menggunakan return untuk mengembalikan nilai, sedangkan pada Stream kita menggunakan yield untuk mengembalikan nilainya.

Apabila menggunakan return maka secara otomatis fungsi tersebut akan berhenti karena selain untuk mengembalikan nilai, return juga untuk menghentikan fungsi/method.

Sedangkan saat menggunakan yield, maka nilai akan dikembalikan dan program akan tetap berjalan sampai tidak ada lagi nilai yang dikembalikan menggunakan yield.

Itulah dua perbedaan mendasar antara penggunaan Future dan Stream, dimana kita bisa mengambil kesimpulan bahwa Stream sifatnya mengembalikan data seperti aliran, dia akan terus mengalir(mengembalikan data) sampai tidak ada lagi yang melewati aliran tersebut baru fungsinya akan terhenti.

Untuk membuktikannya sekarang kita akan coba kode diatas.

Untuk mendapatkan hasil data Stream yang dikembalikan method diatas, maka kita menggunakan method listen, listen ini akan dijalankan apabila ada data yang dikembalikan menggunakan yield tadi.

https://dartpad.dartlang.org/

mudah bukan ?

Selanjutkan kita akan menggunakan yield*, yield dan yield* keduanya sama-sama untuk mengembalikan data, yang membedakannya adalah yield untuk mengembalikan 1 data, sedangkan yield* untuk mengembalikan banyak data yang biasanya data tersebut dari method Stream juga.

Untuk membuktikannya kita bisa buat method baru lagi yang mengembalikan data berupa Stream, lalu kita panggil melalui method sebelumnya menggunakan yield*.

Dan hasilnya berhasil dengan baik.

Bonus tambahan

Ada contoh kasus dimana kita ingin menunggu hingga proses asinkron tersebut selesai baru lanjut ke kode berikutnya, ini biasanya apabila kita menjalankan fungsi asinkron didalam fungsi asinkron, seperti berikut adalah contoh apabila menggunakan Future :

penggunaan await untuk menunggu proses asinkron hingga selesai

Lalu bagaimana pada Stream apabila kita ingin melakukan hal yang sama ?

kita balik ke contoh yang sebelumnya lagi, lalu kita coba gunakan await :

maka hasilnya error dengan keterangan seperti berikut :

Untuk itu kita akan gunakan await for, kita ubah kode diatas menjadi seperti berikut :

maka await sudah berhasil.

Demikan mudah-mudahan artikel ini bermanfaat.

2 Comments :

  1. Teddy Supangkat January 10, 2021 at 10:37 pm

    Terimkasih buat ilmunya, sangat bermanfaat 🙂

    Reply
    1. info@udacoding.com January 18, 2021 at 11:55 am

      Aamiin kak. sama2

      Reply

Leave a Reply :

* Your email address will not be published.