Hedeflere mantık veya sarmalayıcı uygulama

NavEntryDecorator sınıfını kullanarak ek bilgi sağlayabilir veya aynı mantığı hedeflere uygulayabilirsiniz. Bu sınıf, her NavEntry öğesini geri yığında composable bir işlevle sarmalar. Başka bir deyişle, girişteki içeriği süsler.

Özel dekoratör oluşturma

Dekoratör oluşturmak için NavEntryDecorator sınıfını genişletin ve aşağıdaki yöntemleri geçersiz kılın:

  • decorate: Geri yığınınızdaki her NavEntry için çağrılan birleştirilebilir lambda. NavEntry parametre olarak alır. Bu sayede, girişin contentKey özelliğine göre anahtarlanmış durum nesneleri oluşturabilirsiniz. Girişin içeriğine bağımlılıklar sağlamak için CompositionLocalProvider kullanabilirsiniz. İçeriği composable bir işlevle de sarabilir veya yan etkileri tetikleyebilirsiniz. Bu yöntemin içinde her zaman entry.Content() çağrısı yapmalısınız.
  • onPop - NavEntry, geri yığından kaldırıldığında ve kompozisyondan ayrıldığında çağrılan geri çağırma. Kaldırılan girişin contentKey değerini alır. Bu girişle ilişkili herhangi bir durumu tanımlamak ve temizlemek için contentKey öğesini kullanın.

Aşağıdaki örnekte, özel bir dekoratör oluşturmak için NavEntryDecorator sınıfı genişletilmektedir.

// import androidx.navigation3.runtime.NavEntryDecorator
class CustomNavEntryDecorator<T : Any> : NavEntryDecorator<T>(
    decorate = { entry ->
        Log.d("CustomNavEntryDecorator", "entry with ${entry.contentKey} entered composition and was decorated")
        entry.Content()
    },
    onPop = { contentKey -> Log.d("CustomNavEntryDecorator", "entry with $contentKey was popped") }
)

Dekoratörünüzün duruma erişmesi gerekiyorsa bu durumu oluşturan bir composable işlevi oluşturun ve bunu kullanarak dekoratörü oluşturun. Örnek bir uygulama için rememberSaveableStateHolderNavEntryDecorator kaynak koduna bakın. Bu, durumu (SaveableStateHolder) oluşturur ve dekoratörü oluşturmak için kullanır.

Geri yığınını süsleme

NavEntryDecorator oluşturduktan sonra, geri yığınınızdaki girişleri iki şekilde süsleyebilirsiniz:

  • rememberDecoratedNavEntries kullanın. Bu işlev, her biri kendi dekoratör grubuna sahip birden fazla geri yığını olduğunda kullanışlıdır (daha fazla bilgi için bu kod tarifine bakın). İşlev, NavDisplay ile kullanabileceğiniz, NavEntry'lerin süslenmiş bir listesini döndürür.
  • entryDecorators parametresini kullanarak süslemenizi doğrudan NavDisplay öğesine iletin. NavDisplay çağrısı yapar rememberDecoratedNavEntries ve süslenmiş girişleri gösterir.

Varsayılan süslemeyi ekleme

Navigation 3, NavEntry durumunun yapılandırma değişiklikleri ve işlem sonlandırma sırasında korunmasını sağlayan SaveableStateHolderNavEntryDecorator adlı varsayılan bir dekoratör içerir. NavEntry içeriğini SaveableStateProvider ile sarmalar. Bu sayede, NavEntry içeriğindeki rememberSaveable çağrıları doğru şekilde çalışır.

Dekoratörünüz SaveableStateProvider sağlamıyorsa sağlanan dekoratörler listenizdeki ilk dekoratör olarak SaveableStateHolderNavEntryDecorator öğesini eklemeniz gerekir. rememberSaveableStateHolderNavEntryDecorator kullanılarak oluşturulur.

Örneğin:

// import androidx.navigation3.runtime.rememberSaveableStateHolderNavEntryDecorator
NavDisplay(
    entryDecorators = listOf(
        rememberSaveableStateHolderNavEntryDecorator(),
        remember { CustomNavEntryDecorator() }
    ),
    // ...
)

Dekoratör ne zaman kullanılır?

Dekoratör kullanarak:

  • Geri yığında her NavEntry için bir bağımlılık oluşturun. Örneğin, ViewModelStoreNavEntryDecorator, her NavEntry için bir ViewModelStore oluşturur.
  • Bir nesneyi birden fazla NavEntry ile kapsamlandırın. Örneğin, ViewModel öğesini birden fazla giriş arasında paylaşmak için.
  • Aynı işlemi birden fazla NavEntry için gerçekleştirin. Örneğin, her giriş için günlük kaydı, hata ayıklama veya izleme işlemleri gerçekleştirmek.
  • Aynı composable işlevle NavEntry'ları sarmalayın.
  • NavEntry ile ilişkili durumu temizleyin. Örneğin, bir giriş arka yığından kaldırıldığında ViewModelStoreNavEntryDecorator, ilişkili ViewModelStore öğesini temizler.

Dekoratörleri şu amaçlarla kullanmayın:

  • Tek bir NavEntry öğesine bağımlılık aktarın.
  • Kapsamı geri yığından daha geniş olan bağımlılıklar sağlama.

Her iki durumda da bağımlılığı NavEntry oluştururken doğrudan iletin.

Daha fazla kod örneği için NavEntryDecorator bölümüne bakın.