Uygulamanızı meta verilerle yapılandırma

Navigation 3'te, NavEntry, Scene ve NavDisplay gibi farklı kitaplık bileşenleri arasında rastgele bilgileri paylaşmak için meta verileri kullanırsınız. En basit tanımıyla meta veri, Map<String, Any>. Ancak kitaplık, meta verileri okuma ve yazma işlemlerini daha basit ve tür açısından daha güvenli hale getirmek için ek soyutlamalar sağlar.

NavEntry meta verileri sağlama

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

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

Uygulamanız entryProvider DSL'sini 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 harita 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 verileri sağlama

Scene.metadata, varsayılan olarak entries özelliğindeki son girişin metadata değerini döndüren bir özel alıcı kullanır veya null ise boş bir harita döndürü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ü dili (DSL), meta verileri depolamak için kullanılan Map<String, Any> oluşturmaya yönelik tür güvenli bir oluşturucu sağlar.

Meta veri anahtarlarını tanımlama

DSL, 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ımlama kuralı, bunları sınıfa ait iç içe yerleştirilmiş nesneler (veya işlevler ya da composable'lar söz konusu olduğunda, bu anahtarlarla ilişkili değerleri okuyacak ilgili bir nesne) 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 haritası 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, meta verilerin NavMetadataKey ile okunmasını 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]