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:
- Mengembangkan aplikasi Android dengan Kotlin
- Pelajari Kotlin untuk Android
- Coroutine Kotlin di Android. Codelab spesifik berikut mungkin berguna:
- Flow Kotlin di Android dan lebih khusus lagi, StateFlow.
- Status dan Jetpack Compose, khususnya
fungsi
collectAsStateWithLifecycle()
. Fungsi ini secara otomatis mengelola langganan dan berhenti berlangganan dari alur berdasarkan apakah UI yang menampilkan status tersebut benar-benar berada di latar depan atau tidak. - Jika Anda menggunakan Automation API, membaca tentang builder jenis aman Kotlin akan berguna untuk memahami cara kerja Automation DSL.