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 (
apiveimpl) oluşturun. - Her özelliğin gezinme tuşlarını kendi
apimodülüne yerleştirin. - Her özellik için
entryProvidersve gezinilebilir içeriği ilgiliimplmodü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 |
|
|
|
|
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.
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.
Derin bağlantı eşleştiricileri modüler hale getirme
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ü
@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 ekleyebilir 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 aşağıdaki sayfalara bakın:
- Navigation 3 mimarisi kod tarifleri
- Now in Android uygulamasından modülerleştirme öğrenme yolculuğu
- Androidify