Gezinme kodunu modülerleştirme

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

Genel Bakış

Gezinme kodunuzu modüler hale getirme, ilgili gezinme tuşlarını ve temsil ettikleri içerikleri ayrı modüllere ayırma işlemidir. Bu sayede sorumluluklar net bir şekilde ayrılır ve uygulamanızdaki farklı özellikler arasında gezinebilirsiniz.

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

  • Uygulamanızdaki her özellik için iki alt modül (api ve impl) oluşturun.
  • Her özelliğin gezinme tuşlarını kendi api modülüne yerleştirin.
  • Her özellik için entryProviders ve gezinilebilir içeriği ilgili impl modülüne yerleştirin.
  • entryProviders öğesini doğrudan veya bağımlılık ekleme yöntemini kullanarak ana uygulama modüllerinize sağlayın.

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

Uygulamanızdaki her özellik için api ve impl ("uygulama"nın kısaltması) adında 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ı dahil olmak üzere bu özellikle ilgili içerik. Anahtarları içerikle eşleme bölümünü de inceleyin.

Bu yaklaşım, bir özelliğin içeriğinin (impl modülünde yer alır) başka bir modülün (api modülünde yer alır) gezinme tuşlarına bağlı olmasını sağlayarak bir özelliğin diğerine gitmesine olanak tanır.

"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ığı diyagramı.

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

Navigation 3'te, gezinilebilir içerik gezinme 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 öğenizi 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 yöntemini kullanma

Yukarıdaki kod örneğinde, her giriş oluşturucu, entryProvider DSL'yi kullanan ana uygulama tarafından doğrudan çağrılır. Uygulamanızda çok sayıda ekran veya özellik modülü varsa bu kalıp iyi ölçeklenmeyebilir.

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

Örneğin, aşağıdaki kod, giriş oluşturucuları MainActivity tarafından sahip olunan bir Set içine eklemek için Dagger çoklu bağlamalarını, özellikle de @IntoSet kullanır. Bunlar daha sonra entryProvider içinde yinelemeli olarak çağrılır ve çok sayıda giriş oluşturucu işlevini açıkça çağırma ihtiyacını ortadan kaldırır.

Ö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()
    }
}

Uygulama 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) her oluşturucu işlevine uygulamanın gezinme durumunu değiştirebilecek bir nesne ekleyin.

Uygulamanız derin bağlantıları destekliyorsa ve modüler hale getirilmişse her özellik modülü, sahip olduğu hedefler için DeepLinkMatcher örneklerini tanımlamalıdır.

Uygulamanızdaki tüm eşleştiricileri bir araya getirmek için bağımlılık ekleme çoklu bağlamalarını kullanabilirsiniz. Örneğin, her özellik modülü, eşleştiricilerini bir Dagger @IntoSet çoklu bağlamasına ekleyebilir:

Özellik modülü

Ardından, ana uygulama modülünüzde (ör. MainActivity) eşleştirici grubunu ekleyebilir ve gelen istekleri eşleştirmek için kullanabilirsiniz:

Uygulama modülü

Derin bağlantıları tanımlama ve işleme hakkında daha fazla bilgi için Derin bağlantıları destekleme başlıklı makaleyi inceleyin.

Kaynaklar

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