Remote Compose kavramları ve mimarisi

Remote Compose, uygulamanızda Compose tarzı API'lerle kullanıcı arayüzü oluşturmanıza ve bunu uygulama widget'ları veya Wear OS widget'ları gibi sistem işlemlerinde görüntülemenize olanak tanıyan bir Jetpack kitaplığıdır. Uygulamanız, kullanıcı arayüzünü kompakt bir doküman olarak kaydeder ve ana makine işlemindeki bir oynatıcı, uygulamanızı geri çağırmadan kullanıcı arayüzünü oluşturur ve etkileşimleri, durum değişikliklerini ve animasyonları yerel olarak işler.

Bu kılavuzda, Remote Compose mimarisi ve standart Jetpack Compose'dan farkları açıklanmaktadır. Bu kılavuzda, bileşenlerle kullanıcı arayüzü oluşturma konusu ele alınmaktadır.

Uzaktan oluşturma kullanım alanları

Uzaktan Oluşturma, destekleyen bir oynatıcıya sahip her yüzeyde kullanılabilir. Android'de uygulama widget'larını ve Wear OS widget'larını destekler.

İşleyiş şekli: Üç bloklu mimari

Remote Compose ile standart Jetpack Compose arasındaki temel mimari fark, kullanıcı arayüzü tanımının üç üst düzey blokta yürütmeden ayrılmasıdır:

  • Dokümanı oluşturma: Uygulamanız, bir dokümanı kaydetmek için @RemoteComposable işlevlerinizi çalıştırır. Bu doküman; düzeni, uzak durumu ve işlemleri dahil olmak üzere kullanıcı arayüzünün kompakt, serileştirilmiş bir açıklamasıdır. Verileriniz değiştiğinde uygulamanız yeni bir doküman kaydedip gönderebilir.
  • Dokümanı uzak ana makineye taşıma: Uygulamanız, dokümanı ana makineye (ör. başlatıcı veya Wear OS gibi dokümanı görüntüleyen işleme) iletir.
  • Dokümanı oynatma: Ana makinedeki bir Remote Compose oynatıcı, dokümanı oluşturur ve düzen, giriş, kullanıcı deneyimi durumu değişiklikleri ve animasyonları uygulamanızı geri çağırmadan yerel olarak işler.

Bu mimari, gecikmeyi doğrudan azaltan temel avantajlar sağlar:

  • Küçük belge boyutu: Serileştirilmiş belge anlık görüntüleri küçük ve hafiftir.
  • Daha az gidiş dönüş: Uzak ana makine oynatıcısı, etkileşim ve durum değişikliklerini yerel olarak işlediğinden uygulamaya veya sunucuya gidiş dönüş iletişimleri en aza indirilir.

Web sayfası/HTML benzetmesi: Remote Compose, bir web sayfası sunmaya benzer şekilde çalışır. Uygulama sunucusu bir kez HTML/belge yapısı oluşturup gönderir ve tarayıcı ana makinesi bunu oluşturup etkileşimleri arka ucu sürekli sorgulamadan yerel olarak işler.

Uzaktan oluşturma için uygulama işleminden uzak ana makine işlemiyle iletişim
Şekil 1. Uzaktan Oluşturma mimarisinin üç bloğu

Bileşenler

Remote Compose, düzenleri yapılandırmak için üst düzey kullanıcı arayüzü bileşenleri sağlar. Standart Compose eşdeğerleri yerine Remote Compose bileşenlerini ve RemoteModifier kullanın. Bunlar arasında temel düzen kapsayıcılarının yanı sıra dinamik ekran boyutlarını işlemek için özel olarak tasarlanmış uyarlanabilir bileşenler de yer alır:

  • Temel düzen bileşenleri: RemoteBox, RemoteRow ve RemoteColumn gibi yaygın Compose benzeri düzen öğeleri.
  • Uyarlanabilir düzen bileşenleri: Uzak yüzeylere sorunsuz bir şekilde uyum sağlayacak şekilde tasarlanmış RemoteFitBox, RemoteCollapsibleRow ve RemoteCollapsibleColumn gibi özel bileşenler.
  • Materyal Tasarım teması: Tema, Wear OS widget'ları için de aynı şekilde çalışır. RemoteMaterialTheme tarafından sağlanan renk ve tipografi hiyerarşisi kullanılır. Bu sayede, uygulamanız ve widget'larınız genelinde tutarlı bir marka ve tasarım sistemi uygulaması elde edebilirsiniz.

RemoteCanvas ile özel çizim

Özel grafikler ve zamana dayalı animasyonlar için RemoteCanvas kullanın. Bu, oynatıcının ana makinede çalıştırdığı çizim komutlarını kaydeder. Bu kılavuzda, bileşenlerle kullanıcı arayüzü oluşturma konusu ele alınmaktadır.

Temel farklar

Remote Compose'un durumu, mantığı ve işlemleri nasıl yönettiğini anlamak için aşağıdaki temel kavramları inceleyin.

Sembolik durum referansları

Standart Compose'da durum kapsayıcıları, yerel uygulama belleğinde etkin ve okunabilir değerler tutar. Bu değerler, olaylar gerçekleştiğinde uygulama kodu (lambda'lar) tarafından değiştirilir. Remote Compose'da durum bildirimleri, sembolik referanslar olarak işlev görür. Etkin değerleri yerel uygulama belleğinde tutmak yerine, uzak oyuncunun çalışma zamanında yerel olarak yönettiği ve güncellediği bağlamaları bildirirler. Remote Compose'da durumu bildirirken aşağıdaki hususları göz önünde bulundurun:

  • rememberMutableRemoteInt, rememberMutableRemoteFloat veya rememberMutableRemoteString gibi durumları bildirmek için Remote Compose fabrika işlevlerini kullanın.
  • Uygulama kodunuz, oluşturma sırasında uzak durum değişkeninin değerini doğrudan inceleyemez veya okuyamaz.
  • Oynatıcı, kullanıcı dokümanla etkileşimde bulundukça bu değerleri yerel olarak depolar ve günceller.

Uzaktan durum ve Kotlin kontrol akışı

Kotlin kodunuz yalnızca uygulamanız dokümanı oluşturduğunda çalışır. if, when ve for gibi Kotlin ifadeleri, dokümanı o anda bilinen değerlere göre şekillendirebilir (ör. bir listedeki her öğe için bir satırı tekrarlayabilir) ancak daha sonra değişen uzak bir duruma tepki veremez. Uzaktan Oluşturma'da çalışırken aşağıdakileri göz önünde bulundurun:

  • Dallanma mantığı: Dinamik kullanıcı arayüzü geçişi, durumu farklı RemoteComposable alanlarıyla eşleyerek RemoteStateLayout kullanılarak yapılır.
  • Metin değerlendirme: Yalnızca doküman oluşturulduğunda değerlendirilen standart Kotlin dize interpolasyonundan ("$remoteValue") kaçının. Bunun yerine RemoteString değerini RemoteText yöntemine iletin.

RemoteModifier kullanarak dinamik stil oluşturma

Ana makinedeki dinamik stil, oluşturmayı yeniden çalıştırmaz. Bunun yerine, uzak durum değişkenleri doğrudan RemoteModifier.background(remoteColor) gibi değiştiricilere iletilir.

Uzak sistem bağlamı

LocalConfiguration veya LocalDensity gibi CompositionLocal sağlayıcıları, yalnızca belgenin kaydedildiği andaki yerel uygulama ortamını yansıtır. Yüzey yeniden boyutlandırıldığında, görüntüleme durumunu değiştirdiğinde veya zaman içinde ilerlediğinde uzak ana makinede dinamik olarak güncellenmezler. Bunun yerine, oynatıcının çalışma zamanında ana makinede çözdüğü değerleri kullanın. Örneğin, bileşenin mevcut boyutu, RemoteConfiguration veya RemoteDensity.

Bildirimsel işlemler

Standart Compose'da tıklama işleyiciler, uygulamanızda çalışan lambda'lardır. Ana makine, uygulamanızın kodunu çalıştıramaz. Bu nedenle, Remote Compose'da bunun yerine işlem (ör. RemoteModifier.clickable(action) ile) eklersiniz. İşlemler, valueChange ile doğrudan ana makinedeki uzak durumu güncelleyebilir veya pendingIntentAction ya da hostAction ile uygulamanıza veya ana makineye aktarabilir. Tek bir tıklamayla birden fazla işlem çalıştırmak için combinedAction kullanın.

Üst düzey paradigma karşılaştırması

Özellik alanı

Standart Jetpack Compose

Uzaktan Oluşturma

Tıklama ve dokunma etkinlikleri

İşlem içi eşzamanlı lambda'lar

Bildirim temelli serileştirilmiş Action nesneleri

Koşullu mantık

Kotlin'de if ve when kontrol akışı

Standart Kotlin if/when, doküman oluşturulurken bilinen statik durum için normal şekilde çalışır.

Dinamik dallanma, RemoteStateLayout (kullanıcı arayüzü ağaçları için) kullanır.

Kontrol akışı döngüleri

Standart Kotlin for ve while döngüleri

Standart Kotlin döngüleri (repeat, for, forEach) yalnızca doküman oluşturulduğunda çalışır. Ana makinedeki uzak durum üzerinde döngü oluşturamazlar.

Yürütme ana makinesi

Uygulama süreci

Başlatıcı (AppWidget), Wear OS widget'ları veya destekleyici oynatıcı içeren herhangi bir form faktörü

İşlem yaşam döngüsü

Yeniden oluşturma ve oluşturma için işlemin etkin kalması gerekir

İşlem kayıtları kullanıcı arayüzü anlık görüntü dokümanı; Remote Player motoru, bileşen ağacını ayrıştırır, durum değişikliklerini izler ve uygulamayı geri çağırmadan yerel olarak yeniden çizer.

Yan etkiler

Eş yordam yaşam döngüleri (LaunchedEffect)

Ana makinede kullanılamaz. Oluşturma, dokümanı oluşturmak için uygulamanızda çalışır. Bu nedenle, entegrasyon bir oluşturmayı açık tutmadığı sürece eş yordam efektleri uzak kullanıcı arayüzünü yönlendiremez.

Durum paradigması

Yerel bellek durumu değerleri

Ham değerler yerine sembolik durum referansları döndüren fabrika işlevleri (rememberMutableRemoteInt(), rememberNamedRemoteColor()).