Gezinme ve arka plan yığını

NavController, kullanıcının ziyaret ettiği hedefleri içeren bir "arka yığın" barındırır. Kullanıcı, uygulama genelinde ekranlara giderken NavController, arka yığına hedefler ekler ve arka yığından hedefler kaldırır.

Arka yığın, yığın olma durumunda "son giren, ilk çıkar" bir veri yapısıdır. Dolayısıyla NavController, öğeleri yığına aktarır ve üstten çıkarır.

Temel davranış

Geri yığının davranışı hakkında göz önünde bulundurmanız gereken temel gerçekler şunlardır:

  • İlk hedef: Kullanıcı uygulamayı açtığında NavController, ilk hedefi arka yığının en üstüne aktarır.
  • Yığına aktarma: Her bir çağrı NavController.navigate(), belirtilen hedefi yığının en üstüne iter.
  • En üst hedefi açma: Yukarıya veya Geri'ye dokunulduğunda sırasıyla NavController.navigateUp() ve NavController.popBackStack() yöntemleri çağrılır. En popüler varış noktası yığından dışarı çıkarılıyor. Yukarı ve Geri arasındaki fark hakkında daha fazla bilgi için Gezinme İlkeleri sayfasına bakın.

Geri dön

NavController.popBackStack() yöntemi, geçerli hedefi arka yığından çıkarmaya ve önceki hedefe gitmeye çalışır. Bu da kullanıcıyı gezinme geçmişinde bir adım geriye etkili bir şekilde geri götürür. Hedefe başarıyla geri gidip gelmediğini gösteren bir boole döndürür.

Belirli bir hedefe dönme

Belirli bir hedefe gitmek için popBackStack() tuşunu da kullanabilirsiniz. Bunu yapmak için aşırı yüklerinden birini kullanın. Tam sayı id veya route dizesi gibi birkaç tanımlayıcıyı iletmenize olanak tanır. Bu aşırı yüklemeler kullanıcıyı, belirtilen tanımlayıcıyla ilişkili hedefe götürür. En önemlisi de, her şeyi bu hedefin üstündeki yığında yerleştirirler.

Bu aşırı yüklemeler ayrıca inclusive boole değerini de alır. NavController öğesinin, hedefe gittikten sonra belirtilen hedefi arka yığından da çıkarıp çıkarmayacağını belirler.

Örnek olarak şu kısa snippet'i inceleyin:

navController.popBackStack(R.id.destinationId, true)

Burada NavController, destinationId tam sayı kimliğine sahip hedefe geri döner. inclusive bağımsız değişkeninin değeri true olduğundan, NavController ayrıca belirtilen hedefi arka yığından çıkarır.

Başarısız olan geri açma işlemini işleme

popBackStack(), false değerini döndürürse sonraki NavController.getCurrentDestination() çağrısı null değerini döndürür. Bu da uygulamanın, son hedefi arka yığından çıkardığı anlamına gelir. Bu durumda kullanıcı yalnızca boş bir ekran görür.

Bu durum aşağıdaki durumlarda yaşanabilir:

  • popBackStack(), yığından hiçbir şey çıkarmadı.
  • popBackStack(), arka yığından bir hedef çıkardı ve yığın artık boş.

Bu sorunu çözmek için yeni bir hedefe gitmeniz veya etkinliği sonlandırmak için finish() numaralı telefonu çağırmanız gerekir. Aşağıdaki snippet bunu gösterir:

Kotlin

...

if (!navController.popBackStack()) {
    // Call finish() on your Activity
    finish()
}

Java

...

if (!navController.popBackStack()) {
    // Call finish() on your Activity
    finish();
}

Bir varış noktasına gidin

Bir hedeften diğerine giderken arka yığındaki hedefleri kaldırmak için ilişkili navigate() işlev çağrısına bir popUpTo() bağımsız değişkeni ekleyin. popUpTo(), navigate() çağrısının bir parçası olarak Gezinme kitaplığına arka yığındaki bazı hedefleri kaldırma talimatı verir. Parametre değeri, arka yığındaki bir hedefin tanımlayıcısıdır. Tanımlayıcı, tam sayı id veya route dizesi olabilir.

popUpTo() içinde belirttiğiniz hedefin arka yığından çıkması gerektiğini belirtmek üzere inclusive parametresi için true değerine sahip bir bağımsız değişken ekleyebilirsiniz.

Bunu programatik olarak uygulamak için inclusive, true olarak ayarlanmış şekilde NavOptions kapsamında popUpTo() öğesini navigate() öğesine iletin. Bu özellik hem Compose'da hem de Görünümler'de kullanılabilir.

Pencere açılırken durumu kaydet

Bir hedefe gitmek için popUpTo kullandığınızda, isteğe bağlı olarak arka yığından çıkarılan tüm hedeflerin durumlarını kaydedebilirsiniz.

Bu seçeneği etkinleştirmek için popUpToSaveState öğesini, ilişkilendirilmiş action içinde true olarak tanımlayın veya NavController.navigate() çağrısını yapın.

Bir hedefe gittiğinizde, destination özelliğindeki hedefle ilişkilendirilen durumu otomatik olarak geri yüklemek için restoreSaveState öğesini true olarak da tanımlayabilirsiniz.

XML örneği

Aşağıda, bir işlem kullanılarak XML'de popUpTo örneği verilmiştir:

<action
  android:id="@+id/action_a_to_b"
  app:destination="@id/b"
  app:popUpTo="@+id/a"
  app:popUpToInclusive="true"
  app:restoreState=”true”
  app:popUpToSaveState="true"/>

Oluşturma Örnekleri

Aşağıda, Compose'daki aynı yaklaşımın eksiksiz bir örneği verilmiştir:

@Composable
fun MyAppNavHost(
    modifier: Modifier = Modifier,
    navController: NavHostController = rememberNavController(),
    startDestination: String = "destination_a"
) {
    NavHost(
        modifier = modifier,
        navController = navController,
        startDestination = startDestination
    ) {
        composable("destination_a") {
            DestinationA(
                onNavigateToB = {
                // Pop everything up to the "destination_a" destination off the back stack before
                // navigating to the "destination_b" destination
                    navController.navigate("destination_b") {
                        popUpTo("destination_a") {
                            inclusive = true
                            saveState = true
                        }
                    }
                },
            )
        }
        composable("destination_b") { DestinationB(/* ... */) }
    }
}

@ Composable
fun DestinationA(onNavigateToB: () -> Unit) {
    Button(onClick = onNavigateToB) {
        Text("Go to A")
    }
}

NavController.navigate() için nasıl arama yapacağınızı aşağıdaki yöntemlerle daha ayrıntılı bir şekilde değiştirebilirsiniz:

// Pop everything up to the destination_a destination off the back stack before
// navigating to the "destination_b" destination
navController.navigate("destination_b") {
    popUpTo("destination_a")
}

// Pop everything up to and including the "destination_a" destination off
// the back stack before navigating to the "destination_b" destination
navController.navigate("destination_b") {
    popUpTo("destination_a") { inclusive = true }
}

// Navigate to the "search” destination only if we’re not already on
// the "search" destination, avoiding multiple copies on the top of the
// back stack
navController.navigate("search") {
    launchSingleTop = true
}

NavController.navigate() öğesine iletme seçenekleri hakkında genel bilgi için Seçeneklerle gezinme kılavuzu'na bakın.

İşlemleri kullanarak pop

Bir işlemi kullanarak gezinirken, isteğe bağlı olarak arka yığından ek hedefler çıkarabilirsiniz. Örneğin, uygulamanızda ilk giriş akışı varsa kullanıcı giriş yaptıktan sonra, geri düğmesinin kullanıcıları tekrar giriş akışına yönlendirmemesi için girişle ilgili tüm hedefleri arka yığından çıkarmanız gerekir.

Ek kaynaklar

Daha fazla bilgi için aşağıdaki sayfaları okuyun:

  • Dairesel gezinme: Gezinme akışlarının dairesel olduğu durumlarda tıkanıklıkların önüne nasıl geçebileceğinizi öğrenin.
  • İletişim kutusu hedefleri: İletişim hedeflerinin arka yığınınızı yönetmeyle ilgili dikkat edilmesi gereken benzersiz noktaları nasıl sunduğunu okuyun.