Uygulamanızı meta verilerle yapılandırma

Navigation 3'te, NavEntry, Scene ve NavDisplay gibi farklı kitaplık bileşenleri arasında rastgele bilgi paylaşmak için meta verileri kullanırsınız. Meta veriler en basit haliyle Map<String, Any>. Ancak kitaplık, meta verileri okumayı ve yazmayı daha basit ve daha güvenli hale getirmek için ek soyutlamalar sağlar.

NavEntry meta verilerini sağlayın

Uygulamanız NavEntry örneklerini doğrudan oluşturuyorsa giriş için meta verileri metadata oluşturucu parametresini kullanarak sağlarsınız:

when (key) {
    is Home -> NavEntry(key, metadata = mapOf("key" to "value")) {}
}

Uygulamanız entryProvider DSL'yi kullanıyorsa meta verileri entry işlevinin metadata parametresi aracılığıyla sağlarsınız. Bu işlevin iki aşırı yüklemesi vardır: Biri doğrudan bir eşleme alır, diğeri ise girişin anahtarını bağımsız değişken olarak ileten bir lambda alır:

entry<Home>(metadata = mapOf("key" to "value")) { /* ... */ }
entry<Conversation>(metadata = { key: Conversation ->
    mapOf("key" to "value: ${key.id})")
}) { /* ... */ }

Scene meta verilerini sağlayın

Scene.metadata, varsayılan olarak entries özelliğindeki son girişin metadata değerini veya null ise boş bir eşlemeyi döndüren özel bir alıcı kullanır. Scene arayüzünü uygularken bu varsayılan davranışı gerektiği gibi geçersiz kılabilirsiniz.

Meta veri DSL'sini kullanma

Kitaplığın 1.1.0-beta01 sürümünde kullanıma sunulan meta veri alana özgü dil (DSL), meta verileri depolamak için kullanılan Map<String, Any> öğesini oluşturmak üzere tür açısından güvenli bir oluşturucu sağlar.

Meta veri anahtarlarını tanımlama

DSL, bir meta veri anahtarıyla ilişkili değerin türünü tutarlı tutmak için NavMetadataKey arayüzünü kullanır.

Meta veri anahtarlarını tanımlamak için kullanılan kural, bu anahtarlarla ilişkili değerleri okuyacak sınıfın (veya işlevler ya da composable'lar söz konusu olduğunda ilgili bir nesnenin) iç içe yerleştirilmiş nesneleri olarak eklemektir:

// For classes such as scene strategies or nav entry decorators, you can define the keys
// as nested object.
class MySceneStrategy<T : Any> : SceneStrategy<T> {

    // ...

    object MyStringMetadataKey : NavMetadataKey<String>
}

// An example from NavDisplay.
// Because NavDisplay is a function, the metadata keys are defined in an object with the same name.
public object NavDisplay {

    public object TransitionKey :
        NavMetadataKey<AnimatedContentTransitionScope<Scene<*>>.() -> ContentTransform>
}

DSL'yi kullanarak meta veri oluşturma

Meta veri eşlemesi oluşturmak için lambda parametresi alan metadata işlevini kullanın. Bu lambda içinde, NavMetadataKey ve karşılık gelen değeri kullanarak haritaya giriş eklemek için put işlevini kullanın.

entry<Home>(
    metadata = metadata {
        put(NavDisplay.TransitionKey) { fadeIn() togetherWith fadeOut() }
        // An additional benefit of the metadata DSL is the ability to use conditional logic
        if (condition) {
            put(MySceneStrategy.MyStringMetadataKey, "Hello, world!")
        }
    }
) {
    // ...
}

Meta veri anahtarlarını kullanarak meta verileri okuma

Meta veri DSL'si, NavMetadataKey ile meta verileri okumayı kolaylaştıran işlevler de sağlar.

// import androidx.navigation3.runtime.contains
// import androidx.navigation3.runtime.get

val hasMyString: Boolean = metadata.contains(MySceneStrategy.MyStringMetadataKey)
val myString: String? = metadata[MySceneStrategy.MyStringMetadataKey]