Gezinme durumunu kaydetme ve yönetme

Aşağıdaki bölümlerde, arka yığınınızı kaydetme ve arka yığınınızdaki girişlerle ilişkili durumu depolama stratejileri açıklanmaktadır.

Geri yığınınızı kaydetme

Uygulamanızın gezinme durumunun yapılandırma değişiklikleri ve işlem sonlandırma dahil olmak üzere çeşitli yaşam döngüsü etkinliklerinde devam etmesini sağlamak, iyi bir kullanıcı deneyimi için çok önemlidir. Gezinme 3'te geri yığınınız size aittir. Bu nedenle, geri yığınınızı nasıl oluşturacağınız veya kaydedeceğinizle ilgili katı kurallar yoktur. Ancak Gezinme 3, kaydedilebilir bir geri yığını sağlayan bir kolaylık yöntemi sunar: rememberNavBackStack.

rememberNavBackStack hareketini kullanın

rememberNavBackStack birleştirilebilir işlevi, yapılandırma değişiklikleri ve işlem sonlandırması boyunca devam eden bir yedek yığın oluşturmak için tasarlanmıştır.

rememberNavBackStack'ün düzgün çalışması için arka yığınınızdaki her anahtar belirli koşullara uymalıdır:

  • NavKey arayüzünü uygulayın: Arka yığıntaki her anahtar NavKey arayüzünü uygulamalıdır. Bu, anahtarın kaydedilebileceğini kitaplığa bildiren bir işaretçi arayüzü görevi görür.
  • @Serializable ek açıklamasını ekleyin: NavKey'ı uygulamanın yanı sıra anahtar sınıflarınız ve nesneleriniz @Serializable ek açıklamasıyla işaretlenmelidir.

Aşağıdaki snippet'te rememberNavBackStack öğesinin doğru bir şekilde uygulanması gösterilmektedir:

@Serializable
data object Home : NavKey

@Composable
fun NavBackStack() {
    val backStack = rememberNavBackStack(Home)
}

Alternatif: ViewModel'te depolama

Geri yığınınızı yönetmenin bir diğer yolu da ViewModel içinde depolamaktır. ViewModel veya başka bir özel depolama alanı kullanırken işlem sonlandırma sırasında devamlılık sağlamak için:

  • Anahtarlarınızın serileştirilebilir olduğundan emin olun: rememberNavBackStack ile olduğu gibi, gezinme anahtarlarınız da serileştirilebilir olmalıdır.
  • Serileştirme ve serileştirmeyi manuel olarak işleme: Her anahtarın serileştirilmiş temsilini kalıcı depolamaya manuel olarak kaydetmekten ve kalıcı depolama alanından serileştirmekten siz sorumlusunuz (ör. SharedPreferences, veritabanı veya dosya) erişebilir.

ViewModel saniyeden NavEntry saniyeye kadar kapsam

ViewModels, ekran döndürme gibi yapılandırma değişikliklerinde kullanıcı arayüzüyle ilgili durumu korumak için kullanılır. Varsayılan olarak ViewModels, en yakın ViewModelStoreOwner'a (genellikle Activity veya Fragment) göre kapsamlandırılır.

Ancak bir ViewModelActivity'nin tamamı yerine arka yığıntaki belirli bir NavEntry'e (ör. belirli bir ekran veya hedef) göre kapsamını belirlemek isteyebilirsiniz. Bu sayede ViewModel'ın durumunun yalnızca söz konusu NavEntry arka yığının bir parçasıyken korunması ve NavEntry pop edildiğinde temizlenmesi sağlanır.

androidx.lifecycle:lifecycle-viewmodel-navigation3 eklenti kitaplığı, bu işlemi kolaylaştıran bir NavEntryDecorator sağlar. Bu süsleyici, her NavEntry için bir ViewModelStoreOwner sağlar. Bir NavEntry içeriğinin içinde ViewModel oluşturduğunuzda (ör. Oluştur'da viewModel()'yi kullanarak), otomatik olarak arka yığıntaki söz konusu NavEntry anahtarının kapsamına alınır. Bu, NavEntry arka yığına eklendiğinde ViewModel'ün oluşturulduğu ve kaldırıldığında temizlendiği anlamına gelir.

ViewModel'leri NavEntry'lere göre kapsama almak için NavEntryDecorator'ü kullanmak üzere aşağıdaki adımları uygulayın:

  1. androidx.lifecycle:lifecycle-viewmodel-navigation3 bağımlılığını app/build.gradle.kts dosyanıza ekleyin.
  2. NavDisplay oluştururken rememberSavedStateNavEntryDecorator() öğesini entryDecorators listesine ekleyin.
  3. NavDisplay öğenize başka süsleyiciler ekleyin.

NavDisplay(
    entryDecorators = listOf(
        // Add the default decorators for managing scenes and saving state
        rememberSceneSetupNavEntryDecorator(),
        rememberSavedStateNavEntryDecorator(),
        // Then add the view model store decorator
        rememberViewModelStoreNavEntryDecorator()
    ),
    backStack = backStack,
    entryProvider = entryProvider { },
)