Mengelola dan mengupdate GlanceAppWidget

Bagian berikut menjelaskan cara mengupdate GlanceAppWidget dan mengelola status.

Kelola status GlanceAppWidget

Class GlanceAppWidget yang disediakan dibuat instance-nya setiap kali widget dibuat atau memerlukan update, sehingga harus stateless dan pasif.

Konsep status dapat dibagi menjadi beberapa hal berikut:

  • Status aplikasi: Status atau konten aplikasi yang diperlukan oleh . Misalnya, daftar tujuan yang disimpan (yaitu, {i>database<i}) yang ditentukan oleh pengguna.
  • Status sekilas: Status tertentu yang hanya relevan untuk widget aplikasi dan tidak otomatis mengubah atau memengaruhi status aplikasi. Sebagai contoh, dicentang dalam widget atau penghitung dinaikkan.

Menggunakan status aplikasi

Widget aplikasi harus pasif. Setiap aplikasi bertanggung jawab untuk mengelola lapisan data dan menangani status, seperti tidak ada aktivitas, pemuatan, dan error yang mencerminkan di UI widget.

Misalnya, kode berikut mengambil tujuan dari dalam memori cache dari lapisan repositori, menyediakan daftar tujuan yang tersimpan, 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 perbarui widget. Lihat Mengupdate GlanceAppWidget untuk mengetahui informasi selengkapnya.

Mengupdate GlanceAppWidget

Seperti yang dijelaskan di bagian Mengelola status GlanceAppWidget, aplikasi widget dihosting dalam proses yang berbeda. Glance menerjemahkan konten menjadi RemoteViews yang sebenarnya dan mengirimkannya ke {i>host<i}. Untuk memperbarui konten, Glance harus membuat ulang RemoteViews dan mengirimnya lagi.

Untuk mengirim update, panggil metode update dari instance GlanceAppWidget, memberikan 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 dapat dipanggil dari bagian mana pun dari aplikasi Anda. Karena prinsip tersebut suspend, sebaiknya luncurkan fungsi tersebut di luar thread utama ruang lingkup proyek. Pada contoh berikut, aplikasi 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.