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 getirmek, ilgili gezinme tuşlarını ve temsil ettikleri içeriği 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
apiveimplolmak üzere iki alt modül oluşturun. - Her özellik için gezinme tuşlarını
apimodülüne yerleştirin. - Her özellik için
entryProvidersve gezinilebilir içeriği ilişkiliimplmodülüne yerleştirin. - Doğrudan veya bağımlılık ekleme kullanarak ana uygulama modüllerinize
entryProviderssağ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 |
|
|
|
Bu özelliğe ait içerikler ( |
Bu yaklaşım, bir özelliğin impl modülünde bulunan içeriğinin, 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 gezinmeyi mümkün kılar.
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 kalıp 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() } }
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) uygulamanın gezinme durumunu değiştirebilen bir nesneyi her oluşturucu işlevine yerleştirin.
Derin bağlantı eşleştiricileri modülerleştirme
Uygulamanız derin bağlantıları destekliyorsa ve modülerleştirilmiş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 katkıda bulunabilir:
Özellik modülü
@Module @InstallIn(ActivityRetainedComponent::class) object FeatureADeepLinkModule { @IntoSet @Provides fun provideUserMatcher(): DeepLinkMatcher<*, *> { return UriDeepLinkMatcher( DeepLinkUri("www.example.com/users/{id}"), serializer<UserProfileKey>() ) } }
Ardından, ana uygulama modülünüzde (ör. MainActivity) eşleştirici grubunu yerleştirebilir ve gelen istekleri eşleştirmek için kullanabilirsiniz:
Uygulama modülü
@AndroidEntryPoint class MainActivityWithDI : ComponentActivity() { @Inject lateinit var deepLinkMatchers: Set<@JvmSuppressWildcards DeepLinkMatcher<*, *>> override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) val request = DeepLinkRequest(intent = intent) val matchResult = deepLinkMatchers .mapNotNull { it.match(request) } .maxOrNull() val backStack = when (matchResult) { null -> listOf(HomeKey) is BackStackMatchResult<*, *> -> { @Suppress("UNCHECKED_CAST") matchResult.backStack as List<NavKey> } else -> listOf(matchResult.key) } } }
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 şunlara bakın:
- Navigation 3 mimarisiyle ilgili kod tarifleri
- Now in Android uygulamasındaki modülerleştirme öğrenme rotası
- Androidify