Hedeflere mantık veya sarmalayıcı uygulama

NavEntryDecorator sınıfını kullanarak hedeflere ek bilgi sağlayabilir veya aynı mantığı uygulayabilirsiniz. Bu sınıf, eski yığındaki her NavEntry öğesini bir composable işlevle sarmalar. Başka bir deyişle, girişin içeriğini 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: Eski yığınınızdaki her NavEntry için çağrılan, composable bir lambda. NavEntry parametre olarak alınır. Bu sayede, girişin contentKey değerine 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 işlevle de çevreleyebilir veya yan etkileri tetikleyebilirsiniz. Bu yöntemde her zaman entry.Content() yöntemini çağırmanız gerekir.
  • onPop: NavEntry, eski yığından kaldırılıp oluşturma işleminden çıktığında çağrılan bir geri çağırma işlevi. Kaldırılan girişin contentKey değerini alır. Bu girişle ilişkili tüm durumları tanımlamak ve temizlemek için contentKey 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 işlem, durumu (SaveableStateHolder) oluşturur ve dekoratörü oluşturmak için kullanır.

Eski yığını süsleme

NavEntryDecorator oluşturduktan sonra, eski yığınınızdaki girişleri iki yöntemden birini kullanarak süsleyin:

  • rememberDecoratedNavEntries kullanın. Bu işlev, her biri kendi dekoratör grubuna sahip birden fazla eski 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, süslenmiş bir NavEntry listesi döndürür.
  • Dekoratörünüzü entryDecorators parametresini kullanarak doğrudan NavDisplay öğesine sağlayın. NavDisplay, arka planda rememberDecoratedNavEntries işlevini çağırır ve süslenmiş girişleri gösterir.

Varsayılan dekoratörü dahil etme

Navigation 3, NavEntry'nın 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 sarmalayarak NavEntry içeriğindeki rememberSaveable çağrılarının doğru şekilde çalışmasını sağlar.

Dekoratörünüz SaveableStateProvider sağlamıyorsa sağlanan dekoratörler listenizdeki ilk dekoratör olarak SaveableStateHolderNavEntryDecorator eklemeniz gerekir. 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, LocalResultEventBus CompositionLocal'ı kullanarak her NavEntry için ResultEventBus sağlamak üzere ResultEventBusNavEntryDecorator kullanabilirsiniz.

Varsayılan olarak rememberResultEventBusNavEntryDecorator, rememberResultEventBus kullanarak kendi ResultEventBus örneğini dahili olarak oluşturur ve hatırlar. Dekoratör hiyerarşisinin dışından (ör. üst düzey uygulama iskeletinden) etkinlik veri yoluna erişmeniz gerekiyorsa rememberResultEventBus işlevini çağırıp rememberResultEventBusNavEntryDecorator(resultEventBus) parametresine ileterek ResultEventBus nesnesini yukarı taşıyabilirsiniz:

val resultEventBus = rememberResultEventBus()

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

Sonuçları gönderme ve gözlemleme hakkında daha fazla bilgi için Sonuçları döndürme bölümüne bakın.

Dekoratör ne zaman kullanılır?

Dekoratörleri kullanarak:

  • Eski yığındaki her NavEntry için bir bağımlılık oluşturun. Örneğin, ViewModelStoreNavEntryDecorator her NavEntry için bir ViewModelStore oluşturur.
  • Sonuçları iletme ve hedefler arasında iletişim kurma Örneğin, ResultEventBusNavEntryDecorator, eski yığındaki hedeflere ResultEventBus sağlar.
  • Bir nesneyi birden fazla NavEntry ile kapsam içine alın. Örneğin, birden fazla giriş arasında ViewModel paylaşmak için.
  • Birden fazla NavEntry için aynı işlemi gerçekleştirin. Örneğin, her giriş için günlük kaydı, hata ayıklama veya izleme işlemleri gerçekleştirmek amacıyla kullanılabilir.
  • NavEntry öğelerini aynı composable işlevle sarmalayın.
  • NavEntry ile ilişkili durumu temizleyin. Örneğin, eski yığından bir giriş 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ı eski yığından daha geniş olan bağımlılıklar sağlama

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

Daha fazla kod örneği için NavEntryDecorator sayfasına bakın.