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 birleştirilebilir 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çinCompositionLocalProviderkullanabilirsiniz. İç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-NavEntry, geri 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 herhangi bir 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ş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:
rememberDecoratedNavEntrieskullanı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,NavDisplayile kullanabileceğiniz,NavEntry'lerin süslenmiş bir listesini döndürür.entryDecoratorsparametresini kullanarak süslemenizi doğrudanNavDisplayöğesine iletin.NavDisplayçağrısı yaparrememberDecoratedNavEntriesve 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
NavEntryiçin bir bağımlılık oluşturun. Örneğin,ViewModelStoreNavEntryDecorator, herNavEntryiçin birViewModelStoreoluşturur. - Bir nesneyi birden fazla
NavEntryile kapsamlandırı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ş arka 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ğ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.