Pengantar alur

Home API versi Kotlin menggunakan flow, fitur bahasa Kotlin yang menyediakan kemampuan canggih untuk menangani aliran data asinkron, termasuk transformasi, pemfilteran, pemetaan, konversi ke dan dari koleksi, dan sebagainya.

Coroutine sangat terkait dengan alur, dan memberikan abstraksi yang elegan untuk menulis kode asinkron dan membebaskan developer dari keharusan menulis rutinitas callback secara eksplisit. Flow bekerja sama dengan coroutine, yang berfungsi sebagai cara untuk mengambil data dari coroutine secara asinkron, tanpa harus menunggu penyelesaian fungsi atau thread.

Data diambil dari flow oleh konsumen dalam proses yang disebut pengumpulan. Alur Kotlin memiliki fungsi collect() yang dapat digunakan untuk tujuan ini. Yang terjadi dalam alur selama pengumpulan bergantung pada jenis alur.

Alur Kotlin (Flow<T>) bersifat dingin secara default, yang berarti kode builder alur hanya menghasilkan data saat collect() dipanggil. Sebaliknya, alur hot langsung menghasilkan data, yang di-buffer di memori seperti antrean setiap kali data digunakan. Karena mempertahankan data dalam memori, alur panas dianggap memiliki status.

Flow dapat dikonversi dari cold menjadi hot menggunakan operator shareIn (lihat Membuat flow cold menjadi hot menggunakan shareIn ). Anda juga dapat menggunakan SharedFlow atau StateFlow untuk mengubah flow cold menjadi flow hot.

Cara aplikasi contoh menggunakan alur

Aplikasi contoh menggunakan model tampilan di Jetpack Compose yang terhubung ke alur di Home API. Banyak elemen UI aplikasi contoh didorong oleh status, tetapi dapat berinteraksi dengannya. Aplikasi contoh juga menggabungkan status dari perangkat dengan status 'optimis' di UI untuk pengalaman pengguna real-time. Istilah optimis berarti bahwa aplikasi mengasumsikan bahwa tindakan tertentu berhasil dan segera memperbarui UI untuk mencerminkan hasil yang diharapkan tanpa menunggu konfirmasi. Jika ternyata tindakan gagal, UI akan diperbarui untuk mencerminkan status sebenarnya.

Dalam aplikasi contoh, alur dibuat untuk setiap lapisan model tampilan (struktur, ruangan, perangkat). Misalnya, hal ini dilakukan untuk struktur dengan panggilan berikut di GlobalViewModel.kt:

  fun getStructuresState(): StateFlow<List<StructureModel>?> =
    homeClient
      .structures()
      .map { structures -> structures.map { StructureModel(it.name, it) }.sortedBy { it.name } }
      .handleErrors()
      .flowOn(Dispatchers.IO)
      .stateIn(scope = viewModelScope, started = SharingStarted.WhileSubscribed(), null)

emitAll() mengumpulkan semua nilai dari alur yang diberikan dan memunculkannya ke pengumpul. stateIn() membagikan nilai yang terakhir ditampilkan dari satu instance flow upstream yang berjalan dengan beberapa subscriber downstream. Lihat referensi kotlinx.coroutines.flow untuk mengetahui informasi selengkapnya.

Jetpack Compose

Untuk menyimpan objek flow di memori lokal dan mencegahnya dihentikan, gunakan API remember Kotlin.

Di Jetpack Compose, jika Anda menggunakannya dengan collectAsStateWithLifecycle(), Jetpack akan otomatis mengelola langganan dan berhenti berlangganan dari alur berdasarkan apakah UI aplikasi yang menampilkan status tersebut benar-benar berada di latar depan atau tidak.

Panggilan sederhana di aplikasi contoh akan melakukannya. Menggunakan fungsi getStructuresState() yang ditampilkan sebelumnya:

val structuresList by
    remember(globalViewModel) { globalViewModel.getStructuresState() }.collectAsStateWithLifecycle()

Sekarang, saat status untuk struktur berubah (seperti name), fungsi Composable yang menggunakannya akan mencerminkan status yang diperbarui secara otomatis. Di aplikasi contoh, ini adalah fungsi HomeActivityContent().

Resource

Untuk informasi selengkapnya tentang Kotlin, alur, coroutine, dan Jetpack Compose, lihat referensi berikut: