Bagian berikut menjelaskan cara mengupdate GlanceAppWidget
dan mengelola
statusnya.
Kelola status GlanceAppWidget
Class GlanceAppWidget
yang disediakan akan dibuat instance-nya setiap kali widget
dibuat atau memerlukan update, sehingga harus stateless dan pasif.
Konsep status dapat dibagi menjadi berikut:
- Status aplikasi: Status atau konten aplikasi yang diperlukan oleh widget. Misalnya, daftar tujuan tersimpan (yaitu database) yang ditentukan oleh pengguna.
- Status sekilas: Status tertentu yang hanya relevan untuk widget aplikasi dan tidak selalu mengubah atau memengaruhi status aplikasi. Misalnya, kotak centang dipilih di widget atau penghitung ditambahkan.
Menggunakan status aplikasi
Widget aplikasi harus pasif. Setiap aplikasi bertanggung jawab untuk mengelola lapisan data dan menangani status, seperti tidak ada aktivitas, memuat, dan menampilkan error di UI widget.
Misalnya, kode berikut mengambil tujuan dari cache dalam memori dari lapisan repositori, menyediakan daftar tujuan yang disimpan, dan menampilkan UI yang berbeda, bergantung pada statusnya:
class DestinationAppWidget : GlanceAppWidget() { // ... @Composable fun MyContent() { val repository = remember { DestinationsRepository.getInstance() } // Retrieve the cache data everytime the content is refreshed val destinations by repository.destinations.collectAsState(State.Loading) when (destinations) { is State.Loading -> { // show loading content } is State.Error -> { // show widget error content } is State.Completed -> { // show the list of destinations } } } }
Setiap kali status atau data berubah, aplikasi bertanggung jawab untuk memberi tahu dan mengupdate widget. Lihat Update GlanceAppWidget untuk mengetahui informasi selengkapnya.
Mengupdate GlanceAppWidget
Seperti yang dijelaskan di bagian Mengelola status GlanceAppWidget
, widget
aplikasi dihosting dalam proses yang berbeda. Glance menerjemahkan konten ke
RemoteViews
sebenarnya dan mengirimkannya ke host. Untuk memperbarui konten, Glance
harus membuat ulang RemoteViews
dan mengirimkannya lagi.
Untuk mengirim update, panggil metode update
dari instance GlanceAppWidget
,
yang menyediakan context
dan glanceId
:
MyAppWidget().update(context, glanceId)
Untuk mendapatkan glanceId
, buat kueri GlanceAppWidgetManager
:
val manager = GlanceAppWidgetManager(context) val widget = GlanceSizeModeWidget() val glanceIds = manager.getGlanceIds(widget.javaClass) glanceIds.forEach { glanceId -> widget.update(context, glanceId) }
Atau, gunakan salah satu ekstensi GlanceAppWidget update
:
// Updates all placed instances of MyAppWidget MyAppWidget().updateAll(context) // Iterate over all placed instances of MyAppWidget and update if the state of // the instance matches the given predicate MyAppWidget().updateIf<State>(context) { state -> state == State.Completed }
Metode ini bisa dipanggil dari bagian mana pun dalam aplikasi Anda. Karena fungsi tersebut
merupakan fungsi suspend
, sebaiknya luncurkan fungsi tersebut di luar cakupan
thread utama. Pada contoh berikut, keduanya diluncurkan di CoroutineWorker
:
class DataSyncWorker( val context: Context, val params: WorkerParameters, ) : CoroutineWorker(context, params) { override suspend fun doWork(): Result { // Fetch data or do some work and then update all instance of your widget MyAppWidget().updateAll(context) return Result.success() } }
Lihat Coroutine Kotlin di Android untuk detail selengkapnya tentang coroutine.