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:
NavKeyarayüzünü uygulayın: Geri yığındaki her anahtar,NavKeyarayüzünü uygulamalıdır. Bu, anahtarın kaydedilebileceğini kitaplığa bildiren bir işaretleyici arayüzü görevi görür.@Serializableek açıklamasına sahip olma:NavKey'ı uygulamanın yanı sıra, önemli sınıflarınız ve nesneleriniz@Serializableek 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:
androidx.lifecycle:lifecycle-viewmodel-navigation3bağımlılığınıapp/build.gradle.ktsdosyanıza ekleyin.NavDisplayoluştururkenrememberSaveableStateHolderNavEntryDecorator()öğesinientryDecoratorslistesine ekleyin.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 { }, )