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 herNavEntryiçin çağrılan, composable bir lambda.NavEntryparametre olarak alınır. Bu sayede, girişincontentKeydeğerine göre anahtarlanmış durum nesneleri oluşturabilirsiniz. Girişin içeriğine bağımlılıklar sağlamak içinCompositionLocalProviderkullanabilirsiniz. İçeriği composable işlevle de çevreleyebilir veya yan etkileri tetikleyebilirsiniz. Bu yöntemde her zamanentry.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şincontentKeydeğerini alır. Bu girişle ilişkili tüm durumları tanımlamak ve temizlemek içincontentKeykullanı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:
rememberDecoratedNavEntrieskullanı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,NavDisplayile kullanabileceğiniz, süslenmiş birNavEntrylistesi döndürür.- Dekoratörünüzü
entryDecoratorsparametresini kullanarak doğrudanNavDisplayöğesine sağlayın.NavDisplay, arka plandarememberDecoratedNavEntriesiş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
NavEntryiçin bir bağımlılık oluşturun. Örneğin,ViewModelStoreNavEntryDecoratorherNavEntryiçin birViewModelStoreoluşturur. - Sonuçları iletme ve hedefler arasında iletişim kurma Örneğin,
ResultEventBusNavEntryDecorator, eski yığındaki hedeflereResultEventBussağlar. - Bir nesneyi birden fazla
NavEntryile kapsam içine alın. Örneğin, birden fazla giriş arasındaViewModelpaylaşmak için. - Birden fazla
NavEntryiç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.NavEntryile ilişkili durumu temizleyin. Örneğin, eski yığından bir giriş kaldırıldığındaViewModelStoreNavEntryDecorator, ilişkiliViewModelStoreöğ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.