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.