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: Eski yığınınızdaki her NavEntry için çağrılan birleştirilebilir lambda. NavEntry parametresini alır. Bu sayede, girişin contentKey ile anahtarlanmış durum nesneleri oluşturabilirsiniz. Girişin içeriğine bağımlılıklar sağlamak için CompositionLocalProvider 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 bunu 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 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 NavEntry listesini döndürür.
  • NavDisplay parametresini kullanarak süslemenizi doğrudan entryDecorators öğesine iletin. NavDisplay işlevini arka planda rememberDecoratedNavEntries çağırır ve 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 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 listenize ilk dekoratör olarak SaveableStateHolderNavEntryDecorator eklemelisiniz. Şu kullanılarak oluşturulur: rememberSaveableStateHolderNavEntryDecorator.

Örneğin:

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

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.
  • Bir nesneyi birden fazla NavEntry ile kapsamlandırı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ğ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.