Gezinme durumunu kaydetme ve yönetme

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

Geriye gitme 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 kalıcı olmasını sağlamak, iyi bir kullanıcı deneyimi için çok önemlidir. Navigation 3'te geri yığını size aittir. Bu nedenle, nasıl oluşturmanız veya kaydetmeniz gerektiği konusunda katı kurallar yoktur. Ancak Navigation 3, kaydedilebilir bir geri yığın sağlayan kullanışlı bir yöntem sunar: rememberNavBackStack.

rememberNavBackStack hareketini kullanın

rememberNavBackStack composable işlevi, yapılandırma değişiklikleri ve işlem sonlandırma boyunca kalıcı olan bir arka yığın oluşturmak için tasarlanmıştır.

rememberNavBackStack öğesinin doğru şekilde çalışması için geri yığınınızdaki her anahtarın belirli koşullara uyması gerekir:

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

Aşağıdaki snippet'te rememberNavBackStack öğesinin doğru uygulanmış bir örneği gösterilmektedir:

@Serializable
data object Home : NavKey

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

Alternatif: ViewModel içinde depolama

Geri yığını yönetmenin bir diğer yolu, yığını ViewModel içinde saklamaktır. ViewModel veya başka bir özel depolama alanı kullanırken işlem sonlandırma sırasında verilerin kalıcı olması için şunları yapmanız gerekir:

  • Anahtarlarınızın serileştirilebilir olduğundan emin olun: rememberNavBackStack'da olduğu gibi gezinme anahtarlarınızın da serileştirilebilir olması gerekir.
  • Serileştirme ve seri durumdan çıkarma işlemlerini manuel olarak gerçekleştirme: Her anahtarın serileştirilmiş gösterimini kalıcı depolama alanına (ör. Uygulamanız arka plana giderken veya geri yüklenirken SharedPreferences (ör. veritabanı ya da dosya) kullanıyorsanız.

Kapsam ViewModel-NavEntry saniye

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 ile sınırlandırılır. Bu genellikle Activity veya Fragment olur.

Ancak, ViewModel kapsamını tüm Activity yerine geri yığında belirli bir NavEntry (ör. belirli bir ekran veya hedef) ile sınırlamak isteyebilirsiniz. Bu, ViewModel'nın durumunun yalnızca söz konusu NavEntry geri yığında yer alırken korunmasını ve NavEntry çıkarıldığında temizlenmesini sağlar.

androidx.lifecycle:lifecycle-viewmodel-navigation3 eklenti kitaplığı, bu işlemi kolaylaştıran bir NavEntryDecorator sunar. Bu dekoratör, her NavEntry için bir ViewModelStoreOwner sağlar. Bir ViewModel oluşturduğunuzda (ör. Oluşturma'da viewModel() kullanarak), bu ViewModel otomatik olarak arka yığındaki söz konusu NavEntry'nin anahtarıyla sınırlandırılır.NavEntry Bu, NavEntry geri yığına eklendiğinde ViewModel oluşturulacağı ve kaldırıldığında temizleneceği anlamına gelir.

NavEntryDecorator'ı kullanarak ViewModel'ları NavEntry'lara göre kapsamlandırmak için 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 rememberSaveableStateHolderNavEntryDecorator() öğesini entryDecorators listesine ekleyin.
  3. NavDisplay öğenize başka süslemeler 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 { },
)