Remote Compose to biblioteka Jetpack, która umożliwia tworzenie interfejsu za pomocą interfejsów API w stylu Compose w aplikacji i wyświetlanie go w procesach systemowych, takich jak widżety aplikacji lub widżety Wear OS. Aplikacja rejestruje interfejs jako kompaktowy dokument, a odtwarzacz w procesie hosta renderuje go i obsługuje interakcje, zmiany stanu i animacje lokalnie, bez wywoływania aplikacji.
Z tego przewodnika dowiesz się, czym jest architektura Remote Compose i czym różni się od standardowego Jetpack Compose. Ten przewodnik skupia się na tworzeniu interfejsu za pomocą komponentów.
Przypadki użycia funkcji zdalnego tworzenia wiadomości
Zdalne tworzenie może być używane na dowolnej platformie z obsługiwanym odtwarzaczem. Na Androidzie obsługuje widżety aplikacji i widżety Wear OS.
Jak to działa: architektura składająca się z 3 bloków
Podstawowa różnica architektoniczna między Remote Compose a standardowym Jetpack Compose polega na oddzieleniu definicji interfejsu od wykonywania w 3 blokach wysokiego poziomu:
- Utworzenie dokumentu: aplikacja uruchamia funkcje
@RemoteComposable, aby zarejestrować dokument, czyli kompaktowy, zserializowany opis interfejsu, w tym jego układu, stanu zdalnego i działań. Gdy dane się zmienią, aplikacja może zarejestrować i wysłać nowy dokument. - Przeniesienie dokumentu na zdalnego hosta: aplikacja przekazuje dokument do hosta, czyli procesu, który go wyświetla, np. do programu uruchamiającego lub Wear OS.
- Odtwarzanie dokumentu: odtwarzacz Remote Compose w hoście renderuje dokument i obsługuje układ, dane wejściowe, zmiany stanu UX i animacje lokalnie, bez wywoływania aplikacji.
Ta architektura zapewnia główne korzyści, które bezpośrednio zmniejszają opóźnienia:
- Mały rozmiar dokumentu: zserializowane migawki dokumentów pozostają kompaktowe i lekkie.
- Mniejsza liczba operacji w obie strony: ponieważ odtwarzacz hosta zdalnego obsługuje interakcje i zmiany stanu lokalnie, komunikacja w obie strony z aplikacją lub serwerem jest ograniczona do minimum.
Analogia do strony internetowej / kodu HTML: funkcja Remote Compose działa podobnie do wyświetlania strony internetowej. Serwer aplikacji generuje i wysyła strukturę HTML/dokumentu raz, a host przeglądarki renderuje ją i obsługuje interakcje lokalnie bez ciągłego wysyłania zapytań do backendu.
Komponenty
Remote Compose udostępnia komponenty interfejsu wysokiego poziomu do tworzenia układów. Używaj komponentów Remote Compose i RemoteModifier zamiast ich standardowych odpowiedników w Compose. Obejmują one podstawowe kontenery układu oraz komponenty adaptacyjne zaprojektowane specjalnie do obsługi dynamicznych rozmiarów ekranu:
- Podstawowe komponenty układu: typowe elementy układu podobne do Compose, takie jak
RemoteBox,RemoteRowiRemoteColumn. - Komponenty układu adaptacyjnego: specjalistyczne komponenty, takie jak
RemoteFitBox,RemoteCollapsibleRowiRemoteCollapsibleColumn, zaprojektowane tak, aby dostosowywały się do różnych platform zdalnych. - Motywy Material Design: motywy działają tak samo w przypadku widżetów na Wear OS, z hierarchią kolorów i typografią zapewnianą przez
RemoteMaterialTheme. Umożliwia to spójne wdrażanie marki i systemu projektowania w aplikacji i widżetach.
Rysunek niestandardowy z: RemoteCanvas
W przypadku niestandardowych grafik i animacji opartych na czasie użyj RemoteCanvas, który rejestruje polecenia rysowania uruchamiane przez odtwarzacz na hoście. Ten przewodnik skupia się na tworzeniu interfejsu za pomocą komponentów.
Najważniejsze różnice
Zapoznaj się z tymi podstawowymi pojęciami, aby dowiedzieć się, jak funkcja tworzenia wiadomości zdalnych zarządza stanem, logiką i działaniami.
Odwołania do stanu symbolicznego
W standardowym Compose kontenery stanu przechowują aktywne, czytelne wartości w lokalnej pamięci aplikacji, które są modyfikowane przez kod aplikacji (lambdy), gdy coś się dzieje. W Remote Compose deklaracje stanu działają jako odwołania symboliczne. Zamiast przechowywać aktywne wartości w lokalnej pamięci aplikacji, deklarują powiązania, którymi odtwarzacz zdalny zarządza i które aktualizuje lokalnie w czasie działania. Podczas deklarowania stanu w Remote Compose pamiętaj o tych kwestiach:
- Używaj funkcji fabrycznych Remote Compose do deklarowania stanu, takiego jak
rememberMutableRemoteInt,rememberMutableRemoteFloatlubrememberMutableRemoteString. - Kod aplikacji nie może sprawdzać ani odczytywać wartości zmiennej stanu zdalnego bezpośrednio podczas tworzenia.
- Odtwarzacz przechowuje i aktualizuje te wartości lokalnie, gdy użytkownik wchodzi w interakcję z dokumentem.
Stan zdalny a przepływ sterowania w języku Kotlin
Kod Kotlin jest wykonywany tylko wtedy, gdy aplikacja tworzy dokument. Instrukcje Kotlina, takie jak if, when i for, mogą kształtować dokument na podstawie wartości znanych w danym momencie, np. powtarzać wiersz dla każdego elementu na liście, ale nie mogą reagować na stan zdalny, który zmieni się później. Podczas pracy w trybie zdalnego tworzenia wiadomości pamiętaj o tych kwestiach:
- Logika rozgałęziania: dynamiczne przełączanie interfejsu odbywa się za pomocą
RemoteStateLayoutprzez mapowanie stanu na różne boksyRemoteComposable. - Ocena tekstu: unikaj standardowej interpolacji ciągów znaków w Kotlin („
$remoteValue”), która jest oceniana tylko podczas tworzenia dokumentu. Zamiast tego przekażRemoteStringdoRemoteText.
Dynamiczne określanie stylu za pomocą RemoteModifier
Dynamiczne określanie stylu na hoście nie powoduje ponownego uruchomienia kompozycji. Zamiast tego zmienne stanu zdalnego są przekazywane bezpośrednio do modyfikatorów, takich jak RemoteModifier.background(remoteColor).
Kontekst systemu zdalnego
Dostawcy CompositionLocal, tacy jak LocalConfiguration lub LocalDensity, odzwierciedlają tylko lokalne środowisko aplikacji w momencie rejestrowania dokumentu. Nie są one aktualizowane dynamicznie na hoście zdalnym, gdy zmienia się rozmiar powierzchni, stan wyświetlania lub czas. Zamiast tego używaj wartości, które odtwarzacz rozpoznaje na hoście w czasie działania, takich jak bieżący rozmiar komponentu, RemoteConfiguration lub RemoteDensity.
Działania deklaratywne
W standardowym Compose moduły obsługi kliknięć to funkcje lambda, które działają w aplikacji. Host nie może uruchomić kodu aplikacji, więc w Remote Compose dołączasz działania, na przykład za pomocą RemoteModifier.clickable(action). Działanie może aktualizować stan zdalny bezpośrednio na hoście za pomocą valueChange lub przekazywać go do aplikacji lub hosta za pomocą pendingIntentAction lub hostAction. Aby wykonać kilka działań jednym kliknięciem, użyj combinedAction.
Porównanie paradygmatów na wysokim poziomie
Domena cechy |
Standardowy Jetpack Compose |
Zdalne tworzenie wiadomości |
|---|---|---|
Zdarzenia kliknięcia i dotknięcia |
Synchroniczne funkcje lambda w procesie |
Deklaratywne zserializowane obiekty Action |
Logika warunkowa |
Przepływ sterowania if i when w języku Kotlin |
Standardowy kod Kotlin Dynamiczne rozgałęzianie używa |
Pętle sterujące |
Standardowe pętle for i while w języku Kotlin |
Standardowe pętle Kotlin (repeat, for, forEach) są uruchamiane tylko podczas tworzenia dokumentu. Nie mogą zapętlać stanu zdalnego na hoście. |
Host wykonawczy |
Proces aplikacji |
Menu z aplikacjami (AppWidget), widżety Wear OS lub dowolny format z obsługiwanym odtwarzaczem |
Cykl życia procesu |
Aby można było ponownie skomponować i wyrenderować, proces musi pozostać aktywny |
Przetwarzanie dokumentu zrzutu interfejsu użytkownika; silnik odtwarzacza zdalnego analizuje drzewo komponentów, śledzi zmiany stanu i ponownie rysuje lokalnie bez wywoływania aplikacji. |
Efekty uboczne |
Cykle życia współprogramów (LaunchedEffect) |
Niedostępne na hoście. Kompozycja jest uruchamiana w aplikacji, aby utworzyć dokument, więc efekty współprogramu nie mogą sterować zdalnym interfejsem użytkownika, chyba że integracja utrzymuje kompozycję otwartą. |
Paradygmat stanu |
Wartości stanu pamięci lokalnej |
Funkcje fabryczne (rememberMutableRemoteInt(), rememberNamedRemoteColor()), które zwracają symboliczne odwołania do stanu, a nie nieprzetworzone wartości. |