Gezinme kodunu modülerleştirme

Bu sayfa, gezinme kodunuzu modüler hale getirme konusunda size rehberlik eder. Bu belge, genel uygulama modülerleştirme yönergelerini tamamlamak için hazırlanmıştır.

Genel Bakış

Gezinme kodunuzu modülerleştirme, ilgili gezinme tuşlarını ve temsil ettikleri içeriği ayrı modüllere ayırma işlemidir. Bu, sorumlulukların net bir şekilde ayrılmasını sağlar ve uygulamanızdaki farklı özellikler arasında gezinmenize olanak tanır.

Gezinme kodunuzu modüler hale getirmek için aşağıdakileri yapın:

  • Uygulamanızdaki her özellik için api ve impl olmak üzere iki alt modül oluşturun.
  • Her özellik için gezinme tuşlarını api modülüne yerleştirin.
  • Her özellik için entryProviders ve gezinilebilir içerikleri ilişkili impl modülüne yerleştirin.
  • Doğrudan veya bağımlılık ekleme kullanarak ana uygulama modüllerinize entryProviders sağlayın.

Özellikleri API ve uygulama alt modüllerine ayırma

Uygulamanızdaki her özellik için api ve impl (kısaca "implementation") adlı iki alt modül oluşturun. Gezinme kodunu nereye yerleştireceğinize karar vermek için aşağıdaki tabloyu kullanın.

Modül adı

İçerir

api

gezinme tuşları

impl

NavEntry ve entryProvider tanımları da dahil olmak üzere bu özelliğe yönelik içerikler. Ayrıca anahtarları içerikle eşleme başlıklı makaleyi de inceleyin.

Bu yaklaşım, bir özelliğin impl modülünde bulunan içeriğinin, söz konusu modülün api modülünde bulunan başka bir modülün gezinme tuşlarına bağlı olmasına izin vererek bir özellikten diğerine gezinmesini sağlar.

`impl` modüllerinin `api` modüllerine nasıl bağlı olabileceğini gösteren özellik modülü bağımlılığı diyagramı.
Şekil 1. Uygulama modüllerinin API modüllerine nasıl bağlı olabileceğini gösteren özellik modülü bağımlılık şeması.

Uzantı işlevlerini kullanarak gezinme girişlerini ayırma

Navigasyon 3'te, gezinilebilir içerik navigasyon girişleri kullanılarak tanımlanır. Bu girişleri ayrı modüllere ayırmak için EntryProviderScope üzerinde uzantı işlevleri oluşturun ve bunları ilgili özelliğin impl modülüne taşıyın. Bunlar giriş oluşturucular olarak bilinir.

Aşağıdaki kod örneğinde, iki gezinme girişi oluşturan bir giriş oluşturucu gösterilmektedir.

// import androidx.navigation3.runtime.EntryProviderScope
// import androidx.navigation3.runtime.NavKey

fun EntryProviderScope<NavKey>.featureAEntryBuilder() {
    entry<KeyA> {
        ContentRed("Screen A") {
            // Content for screen A
        }
    }
    entry<KeyA2> {
        ContentGreen("Screen A2") {
            // Content for screen A2
        }
    }
}

Ana uygulama modülünüzde entryProvider tanımlarken entryProvider DSL'sini kullanarak bu işlevi çağırın.

// import androidx.navigation3.runtime.entryProvider
// import androidx.navigation3.ui.NavDisplay
NavDisplay(
    entryProvider = entryProvider {
        featureAEntryBuilder()
    },
    // ...
)

Ana uygulamaya giriş eklemek için bağımlılık ekleme özelliğini kullanma

Önceki kod örneğinde, her giriş oluşturucu, entryProvider DSL'si kullanılarak doğrudan ana uygulama tarafından çağrılır. Uygulamanızda çok sayıda ekran veya özellik modülü varsa bu durum iyi ölçeklenmeyebilir.

Bu sorunu çözmek için her özellik modülünün, bağımlılık ekleme kullanarak giriş oluşturucularını uygulamanın etkinliğine katkıda bulunmasını sağlayın.

Örneğin, aşağıdaki kod, giriş oluşturucuları MainActivity tarafından sahip olunan bir Set öğesine yerleştirmek için Dagger çoklu bağlamalarını, özellikle de @IntoSet öğesini kullanır. Bu işlevler daha sonra entryProvider içinde yinelemeli olarak çağrılır ve çok sayıda giriş oluşturucu işlevinin açıkça çağrılmasına gerek kalmaz.

Özellik modülü

// import dagger.Module
// import dagger.Provides
// import dagger.hilt.InstallIn
// import dagger.hilt.android.components.ActivityRetainedComponent
// import dagger.multibindings.IntoSet

@Module
@InstallIn(ActivityRetainedComponent::class)
object FeatureAModule {

    @IntoSet
    @Provides
    fun provideFeatureAEntryBuilder() : EntryProviderScope<NavKey>.() -> Unit = {
        featureAEntryBuilder()
    }
}

App modülü

// import android.os.Bundle
// import androidx.activity.ComponentActivity
// import androidx.activity.compose.setContent
// import androidx.navigation3.runtime.EntryProviderScope
// import androidx.navigation3.runtime.NavKey
// import androidx.navigation3.runtime.entryProvider
// import androidx.navigation3.ui.NavDisplay
// import javax.inject.Inject

class MainActivity : ComponentActivity() {

    @Inject
    lateinit var entryBuilders: Set<@JvmSuppressWildcards EntryProviderScope<NavKey>.() -> Unit>

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContent {
            NavDisplay(
                entryProvider = entryProvider {
                    entryBuilders.forEach { builder -> this.builder() }
                },
                // ...
            )
        }
    }
}

Gezinme girişlerinizin gezinmesi gerekiyorsa (ör. yeni ekranlara giden kullanıcı arayüzü öğeleri içeriyorsa) uygulamanın gezinme durumunu değiştirebilen bir nesneyi her oluşturucu işlevine yerleştirin.

Kaynaklar

Navigation 3 kodunun nasıl modüler hale getirileceğini gösteren kod örnekleri için şunlara bakın: