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 herNavEntryiçin çağrılan, oluşturulabilir bir lambda.NavEntryparametre olarak alır. Bu sayede, girişincontentKeyözelliğine göre anahtarlanmış durum nesneleri oluşturabilirsiniz. Girişin içeriğine bağımlılıklar sağlamak içinCompositionLocalProvideröğesini kullanabilirsiniz. İçeriği composable bir işlevle de sarabilir veya yan etkileri tetikleyebilirsiniz. Bu yöntemin içinde her zamanentry.Content()çağrısı yapmalısınız.onPop: BirNavEntryeski yığından kaldırıldığında ve kompozisyondan ayrıldığında çağrılan geri çağırma. Kaldırılan girişincontentKeydeğerini alır. Bu girişle ilişkili durumu tanımlamak ve temizlemek içincontentKeyöğ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:
rememberDecoratedNavEntrieskullanı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,NavDisplayile kullanabileceğinizNavEntryöğelerinin süslenmiş bir listesini döndürür.entryDecoratorsparametresini kullanarak süslemenizi doğrudanNavDisplayöğesine iletin.NavDisplay, arka plandarememberDecoratedNavEntriesç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
NavEntryiçin bir bağımlılık oluşturun. Örneğin,ViewModelStoreNavEntryDecorator, herNavEntryiçin birViewModelStoreoluşturur. - Sonuçları iletin ve hedefler arasında iletişim kurun. Örneğin,
ResultEventBusNavEntryDecorator, eski yığında bulunan hedefler içinResultEventBussağlar. - Bir nesneyi birden fazla
NavEntryile sınırlayın. Örneğin,ViewModelöğesini birden fazla giriş arasında paylaşmak için. - Aynı işlemi birden fazla
NavEntryiç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. NavEntryile ilişkili durumu temizleyin. Örneğin, bir giriş eski yığından 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ı 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.