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
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çerikleri 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 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.
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:
- Navigation 3 mimarisiyle ilgili kod tarifleri
- Now in Android uygulamasındaki modülerleştirme öğrenme rotası
- Androidify