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, oluşturulabilir bir 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 öğesini 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: Bir NavEntry eski 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 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şlev oluşturun ve ardından dekoratörü oluşturmak için bu işlevi kullanın. Örnek bir uygulama için rememberSaveableStateHolderNavEntryDecorator kaynak koduna bakın. Bu, durumu (SaveableStateHolder) oluşturur ve dekoratörü oluşturmak için kullanır.

Geriye dönük yığı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ınız olduğunda kullanışlıdır (daha fazla bilgi için bu kod tarifine bakın). İşlev, NavDisplay ile kullanabileceğiniz NavEntry öğelerinin süslenmiş bir listesini döndürür.
  • entryDecorators parametresini kullanarak süslemenizi doğrudan NavDisplay öğesine iletin. NavDisplay, arka planda rememberDecoratedNavEntries çağrısı yapar ve süslenmiş girişleri gösterir.

Varsayılan dekoratörü ekleyin

Navigation 3, NavEntry durumunun yapılandırma değişiklikleri ve işlem sonlandırma boyunca 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'ı eklemelisiniz. rememberSaveableStateHolderNavEntryDecorator kullanılarak oluşturulur.

Örneğin:

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

ResultEventBusNavEntryDecorator kullanarak sonuçları iletme

Navigation 3 1.2.0 sürümünden itibaren, ResultEventBusNavEntryDecorator kullanarak LocalResultEventBus kompozisyon yerelini kullanan her NavEntry için ResultEventBus sağlayabilirsiniz.

Varsayılan olarak rememberResultEventBusNavEntryDecorator, rememberResultEventBus kullanarak kendi ResultEventBus örneğini dahili olarak oluşturur ve hatırlar. Etkinlik veri yoluna dekoratör hiyerarşisinin dışında (ör. üst düzey uygulama iskeletinde) erişmeniz gerekiyorsa ResultEventBus işlevini rememberResultEventBus işlevini çağırarak ve rememberResultEventBusNavEntryDecorator(resultEventBus) işlevine ileterek yükseltebilirsiniz:

val resultEventBus = rememberResultEventBus()

NavDisplay(
    /* ... */
    entryDecorators = listOf(
        rememberSaveableStateHolderNavEntryDecorator(),
        rememberResultEventBusNavEntryDecorator(resultEventBus = resultEventBus)
    )
)

Sonuç gönderme ve gözlemleme hakkında daha fazla bilgi için Sonuçları döndürme başlıklı makaleyi inceleyin.

Dekoratör ne zaman kullanılır?

Dekoratörleri 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.
  • Sonuçları iletin ve hedefler arasında iletişim kurun. Örneğin, ResultEventBusNavEntryDecorator, eski yığında bulunan hedefler için ResultEventBus sağlar.
  • Bir nesneyi birden fazla NavEntry ile sınırlayı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ş eski 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ğlayın.

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

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