GlanceAppWidget'ı yönetme ve güncelleme

Aşağıdaki bölümlerde GlanceAppWidget güncelleme ve durumunun nasıl yönetileceği açıklanmaktadır.

GlanceAppWidget durumunu yönet

Widget oluşturulduğunda veya güncelleme gerektiğinde sağlanan GlanceAppWidget sınıfı örneklenir. Bu nedenle, durum bilgisiz ve pasif olmalıdır.

Eyalet kavramı iki şekilde ayrılabilir:

  • Uygulama durumu: Widget'ın gerektirdiği uygulamanın durumu veya içeriği. Örneğin, kullanıcı tarafından tanımlanan depolanan hedeflerin (veri tabanı) bir listesi.
  • Bakış durumu: Yalnızca uygulama widget'ıyla alakalı olan ve uygulamanın durumunu değiştirmeyen veya etkilemeyen belirli durum. Örneğin, widget'ta bir onay kutusu seçilmiş veya sayaç artırılmıştır.

Uygulama durumunu kullan

Uygulama widget'ları pasif olmalıdır. Her uygulama, veri katmanını yönetmek ve boşta kalma, yükleme ve widget kullanıcı arayüzünde hata yansıtma gibi durumları yönetmekten sorumludur.

Örneğin, aşağıdaki kod kod deposu katmanından, bellek içi önbellekten hedefleri alır, depolanan hedef listesini sağlar ve durumuna bağlı olarak farklı bir kullanıcı arayüzü görüntüler:

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
            }
        }
    }
}

Durum veya veriler değiştiğinde widget'ı bildirmek ve güncellemek uygulamanın sorumluluğudur. Daha fazla bilgi için GlanceAppWidget'ı güncelleme bölümüne bakın.

GlanceAppWidget uygulamasını güncelle

GlanceAppWidget durumunu yönetme bölümünde açıklandığı gibi, uygulama widget'ları farklı bir süreçte barındırılır. Glance, içeriği gerçek RemoteViews diline çevirir ve düzenleyen kişiye gönderir. İçeriği güncellemek için Glance'ın RemoteViews dosyasını yeniden oluşturup tekrar göndermesi gerekir.

Güncellemeyi göndermek için context ve glanceId özelliklerini sağlayarak GlanceAppWidget örneğinin update yöntemini çağırın:

MyAppWidget().update(context, glanceId)

glanceId edinmek için GlanceAppWidgetManager sorgusunu sorgulayın:

val manager = GlanceAppWidgetManager(context)
val widget = GlanceSizeModeWidget()
val glanceIds = manager.getGlanceIds(widget.javaClass)
glanceIds.forEach { glanceId ->
    widget.update(context, glanceId)
}

Alternatif olarak, GlanceAppWidget update uzantılarından birini kullanabilirsiniz:

// 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
}

Bu yöntemler, uygulamanızın herhangi bir bölümünden çağrılabilir. suspend işlevleri olduklarından ana iş parçacığı kapsamının dışında başlatmanızı öneririz. Aşağıdaki örnekte, CoroutineWorker içinde başlatılır:

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()
    }
}

Eş kotinler hakkında daha fazla bilgi için Android'de Kotlin Eş yordamları başlıklı makaleye bakın.