Flutter: Event Channel

How to stream data from native side

Yudi Setiawan
Nusanet Developers
6 min readMar 14, 2022

--

Pengenalan

Salah satu tantangan terbesar untuk framework cross platform seperti Flutter ini ialah bagaimana cara mereka agar si Flutter ini tetap bisa menggunakan fungsi-fungsi native dari sebuah platform. Baik itu di sisi mobile ada Android dan iOS maupun nanti kedepannya untuk platform Web dan Desktop (Mac, Linux, dan Windows). Beruntungnya di Flutter sudah mereka sediakan yang namanya itu platform channel. Jadi, platform channel ini ialah cara bagaimana si Flutter atau bahasa Dart bisa berkomunikasi dengan kode-kode native-nya si platform. Misal, kalau di Android kita bisa berkomunikasi dengan kode Java atau Kotlin. Dan di iOS bisa berkomunikasi dengan Obj-C atau Swift. Jadi, di platform channel ini ada 3 metode yang bisa kita gunakan untuk melakukan komunikasi dengan kode native-nya. Berikut adalah beberapa metodenya.

1. Method Channel

Untuk yang pertama, method channel ini ialah sebuah metode dimana, kita membuat kode Dart yang memanggil fungsi yang ada di native-nya. Jadi, secara sederhana saya katakan saja bahwa method channel ini cara kerjanya hampir mirip seperti kita memanggil sebuah method. Kita panggil method yang ada di native dari bahasa Dart lalu, kita tunggu respon yang diberikan oleh si native.

Cara kerja method channel di Flutter

Untuk pembahasan detail-nya bisa kamu baca pada link berikut ini ya.

2. Event Channel

Untuk metode kedua, ini cara kerjanya berbeda dengan metode pertama. Jadi, jika di method channel kita panggil method yang ada di native dan menunggu kembalian datanya. Maka, di event channel kita cukup meng-listen data yang diberikan oleh si native. Cara kerjanya ini hampir mirip kayak stream. Jadi, di sisi Dart kita cukup listen aja. Dan di sisi native-nya nanti yang akan mengirimkan datanya.

Cara kerja event channel

3. Basic Message Channel

Untuk metode yang ketiga ini jujur saja saya kurang begitu paham gimana cara kerjanya. Tapi, nanti kalau saya sudah paham akan saya buat tulisan terpisah mengenai detail penggunaannya.

Dari ketiga metode tersebut yang pernah saya pakai di lapangan itu hanya yang method channel saja. Untuk event channel saya belum pakai karena belum ada kebutuhan untuk menggunakannya. Jadi, untuk method channel saya pernah pakai untuk menggunakan plugin camera native-nya si Android ketimbang menggunakan plugin camera-nya si Flutter. Alasannya cukup sederhana yaitu, karena pas dipakai oleh user ternyata ada beberapa sebagian device Android yang error ketika coba pakai plugin camera-nya si Flutter. Alhasil saya kepikiran untuk memisahkan kode untuk fitur camera-nya. Untuk Android-nya saya pakai method channel agar menggunakan plugin camera-nya si Android sementara, untuk iOS saya tetap pakai plugin camera-nya si Flutter. So far sih untuk plugin camera di iOS belum ada kendala ya.

Contoh Kasus

Jadi, di tulisan ini saya akan bahas detail mengenai penggunaan event channel. Untuk projeknya silakan kita buat projek baru dengan nama belajar_flutter_event_channel.

Buat projek baru

Untuk platform-nya nanti kita coba buat untuk Android dan iOS saja ya.

Buat UI Utama

Jadi, di contoh kasus kali ini kita akan coba buat aplikasi timer. Cuma timer-nya itu dibuat dari kode native-nya bukan dari Dart. Untuk memulai membuatnya kita perlu buat UI-nya terlebih dahulu. Silakan kita buka file main.dart dan ubah kode didalamnya menjadi seperti berikut.

Bisa kita lihat pada kode diatas bahwa kita ada menggunakan widget ValueListenableBuilder untuk meng-listen perubahan dari variable valueNotifier . Kemudian, didalam method initState kita ada menggunakan event channel untuk meng-listen data yang diberikan dari si native dan data yang dari native akan kita masukkan kedalam variable valueNotifier . Dan berikut ini adalah tampilan dari programnya.

Tampilan utama dari program

Buat Event Channel di Android

Untuk membuat event channel di Android silakan kita buka file MainActivity.kt (sesuaikan dengan bahasa native-nya masing-masing ya) dan ubah kode didalamnya menjadi seperti berikut.

Jadi, didalam file tersebut kita ada menggunakan timer miliknya si Android lalu, data counter-nya kita kirim kedalam variable eventSink . Nah, data yang kita kirim ini nantinya akan diterima oleh si Flutter karena si Flutter kan tadinya sudah meng-listen ya. Sehingga jika kita jalankan programnya maka, output untuk di Android akan menjadi seperti berikut.

Output event channel di Android

Buat Event Channel di iOS

Untuk yang iOS kita bisa buka file AppDelegate.swift dan ubah kode didalamnya menjadi seperti berikut.

Cara kerjanya sama seperti di Android. Kita ada menggunakan timer-nya si iOS lalu data dari variable counter kita masukkan kedalam variable eventSink.

Output event channel di iOS

Kesimpulan

Jadi, kesimpulannya adalah Flutter memiliki 3 metode untuk bisa melakukan komunikasi dari Dart ke platform-nya masing-masing yaitu, method channel, event channel, dan basic message channel. Event channel memiliki cara kerja mirip seperti stream. Dari Dart cukup meng-listen datanya dan native-nya akan mengirimkan datanya. Untuk source code lengkapnya bisa di Github ya.

--

--