W sekcjach poniżej dowiesz się, jak zaktualizować zasób GlanceAppWidget
i nim zarządzać
stanu.
Zarządzaj stanem: GlanceAppWidget
Wystąpienie podanej klasy GlanceAppWidget
jest tworzone za każdym razem, gdy widżet jest
została utworzona lub wymaga aktualizacji, więc powinna być bezstanowa i pasywna.
Pojęcie państwa można podzielić na następujące przypadki:
- Stan aplikacji: stan lub zawartość aplikacji wymagane przez widżet. Na przykład lista zapisanych miejsc docelowych (tj. bazy danych) zdefiniowanych przez użytkownika.
- Stan w skrócie: konkretny stan dotyczący tylko widżetu aplikacji. i niekoniecznie zmieniają ani nie wpływają na stan aplikacji. Na przykład plik w widżecie zostało zaznaczone pole wyboru lub licznik został zwiększony.
Użyj stanu aplikacji
Widżety aplikacji powinny być pasywne. Każda aplikacja odpowiada za zarządzanie warstwa danych i obsługę stanów, takich jak brak aktywności, wczytywanie i odzwierciedlenie błędów. w interfejsie widżetu.
Na przykład poniższy kod pobiera miejsca docelowe z pamięci z warstwy repozytorium, udostępnia zapisaną listę miejsc docelowych oraz wyświetla różne elementy interfejsu w zależności od jego stanu:
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 } } } }
Za każdym razem, gdy stan lub dane ulegną zmianie, aplikacja musi powiadomić Cię o zmianie i zaktualizuj widżet. Więcej informacji znajdziesz w sekcji Aktualizacja aplikacji GlanceAppWidget.
Aktualizuj usługę GlanceAppWidget
Zgodnie z opisem w sekcji Zarządzanie stanem GlanceAppWidget
aplikacja
widżety są hostowane w innym procesie. W skrócie funkcja ta przekłada treść na
RemoteViews
i wysyła je do hosta. Aby zaktualizować treść, spojrzenie w górę
musi ponownie utworzyć obiekt RemoteViews
i wysłać je jeszcze raz.
Aby wysłać aktualizację, wywołaj metodę update
instancji GlanceAppWidget
:
zapewniając context
i glanceId
:
MyAppWidget().update(context, glanceId)
Aby uzyskać glanceId
, wyślij zapytanie do GlanceAppWidgetManager
:
val manager = GlanceAppWidgetManager(context) val widget = GlanceSizeModeWidget() val glanceIds = manager.getGlanceIds(widget.javaClass) glanceIds.forEach { glanceId -> widget.update(context, glanceId) }
Możesz też użyć jednego z rozszerzeń 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 }
Te metody można wywoływać z dowolnej części aplikacji. Ponieważ są one
funkcji suspend
, zalecamy uruchamianie ich poza wątkiem głównym.
zakresu. W poniższym przykładzie są one uruchamiane w 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() } }
Więcej informacji o współrzędnych znajdziesz na stronie Kotlin Coroutines na Androidzie.