Android Academy · Ders

Modüller Arası Gezinme

Özellikleri sıkı bağımlılık oluşturmadan bağlayın.

4. ders / 413 adım

Modüller Arası Gezinme, CoddyKit'te ücretsiz bir Android Academy dersidir. Bu, 4 dersinin 4. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, Android Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. Android Academy kursu toplamda 4 dersten oluşur.

Gezinme Sorunu

Özellikler ayrı modüllerde yaşadığında yeni bir soru ortaya çıkar: :feature:home, :feature:profile modülündeki bir ekranı ona bağımlı olmadan nasıl açabilir? Özellikler birbirini doğrudan içe aktarırsa sıkı bağlılık oluşur ve döngü riski ortaya çıkar.

Bu derste özellikleri bağımsız tutarken gezinme yoluyla birbirine bağlayacaksınız.

NavHost Nerede Bulunur

Tek NavHost, her özellik hakkında bilgi sahibi olmasına izin verilen tek yer olan :app modülünde bulunur. Her özellik kendi hedeflerini sağlar ve :app bunları tek bir grafikte birleştirir.

// app/AppNavHost.kt
@Composable
fun AppNavHost(navController: NavHostController = rememberNavController()) {
    NavHost(navController, startDestination = HomeRoute) {
        homeScreen(onProfileClick = { navController.navigate(ProfileRoute) })
        profileScreen(onBack = { navController.popBackStack() })
    }
}

Tür Güvenli Rotalar

Modern Navigation Compose, tür güvenli rotaları destekler: rota, sihirli bir dize değil, bir @Serializable nesnesi veya veri sınıfıdır. Her özellik, kendi gezinme sözleşmesine sahip olması için rota türünü kendi modülünde tanımlar.

// feature/profile/ProfileRoute.kt
import kotlinx.serialization.Serializable

@Serializable
data class ProfileRoute(val userId: String)

Özellikler NavGraphBuilder Genişletmeleri Sağlar

Temel yöntem şudur: her özellik, hedefini kaydeden bir NavGraphBuilder genişletme işlevi sağlar. Ekran özelliğe aittir; :app yalnızca bu işlevi çağırır. Özellik hiçbir zaman diğer özelliklere başvurmaz.

// feature/profile/ProfileNavigation.kt
fun NavGraphBuilder.profileScreen(onBack: () -> Unit) {
    composable<ProfileRoute> { backStackEntry ->
        val route: ProfileRoute = backStackEntry.toRoute()
        ProfileScreen(userId = route.userId, onBack = onBack)
    }
}

Gezinme Geri Çağrılarıyla Ayrıştırma

Bir özellik hiçbir zaman doğrudan navigate(SomeOtherFeatureRoute) çağırmamalıdır; çünkü bu, diğer özelliğe bağımlı olmayı gerektirir. Bunun yerine özellik, onProfileClick gibi lambda geri çağrıları sağlar. Bunların gerçekte nereye gideceğine :app modülü karar verir.

// feature/home/HomeNavigation.kt
fun NavGraphBuilder.homeScreen(onProfileClick: (String) -> Unit) {
    composable<HomeRoute> {
        HomeScreen(onUserClick = { userId -> onProfileClick(userId) })
    }
}
// :home does NOT know ProfileRoute exists.

:app Modülü Her Şeyi Birbirine Bağlar

Her rota hakkında bilgi sahibi olan ve geri çağrıları gerçek gezinmeye bağlayan tek modül :app modülüdür. Bağlılığın kabul edilebilir olduğu tek yer burasıdır — modülün bütün görevi birleştirmedir.

// app/AppNavHost.kt
NavHost(navController, startDestination = HomeRoute) {
    homeScreen(
        onProfileClick = { userId ->
            navController.navigate(ProfileRoute(userId)) // app knows both
        }
    )
    profileScreen(onBack = { navController.popBackStack() })
}

Bağımsız Değişkenleri Güvenle Aktarma

Rotalar @Serializable veri sınıfları olduğundan bağımsız değişkenler derleme zamanında tür denetiminden geçer. Bunları hedefin içinde toRoute() ile geri okursunuz. Artık dize ayrıştırma veya çalışma zamanında arguments?.getString(...) kaynaklı çökmeler yaşanmaz.

// Reading arguments inside the destination
composable<ProfileRoute> { entry ->
    val args: ProfileRoute = entry.toRoute()
    ProfileScreen(userId = args.userId)
}

// Or directly in a ViewModel via SavedStateHandle
val route: ProfileRoute = savedStateHandle.toRoute()

Rota Türlerini api Modülüyle Paylaşma

Bazen bir özellik gerçekten başka bir özelliğe gitmek ve rota türünü kullanmak zorunda kalır. Özelliğin tamamına bağımlı olmak yerine yalnızca rotayı, @Serializable rotasını içeren küçük bir :feature:profile:api modülünde dışa açın. Ağır :impl modülü özel kalır.

// feature/profile/api  -> only the route type
@Serializable
data class ProfileRoute(val userId: String)

// feature/home/build.gradle.kts
// home may depend on the lightweight api to build the route,
// but never on :feature:profile:impl
implementation(project(":feature:profile:api"))

Özellik Başına İç İçe Gezinme

Birden fazla ekranı olan bir özellik, navigation<T> kullanarak bütün bir iç içe grafik sağlayabilir. Özellik kendi iç akışına sahip olur; :app yalnızca grafiği tek bir giriş noktasına yerleştirir.

// feature/onboarding/OnboardingNavigation.kt
fun NavGraphBuilder.onboardingGraph(onFinished: () -> Unit) {
    navigation<OnboardingGraph>(startDestination = WelcomeRoute) {
        composable<WelcomeRoute> { WelcomeScreen() }
        composable<PermissionsRoute> { PermissionsScreen(onDone = onFinished) }
    }
}

Modüller Arası Derin Bağlantılar

Tür güvenli rotalar ayrıca derin bağlantıları da destekler. Bir özellik, hedefi için bir derin bağlantı URI kalıbı tanımlar; :app NavHost, gelen bağlantıyı modüller arası içe aktarma gerektirmeden doğru özellik ekranına çözümler.

composable<ProfileRoute>(
    deepLinks = listOf(
        navDeepLink<ProfileRoute>(basePath = "https://myapp.com/profile")
    )
) { entry ->
    ProfileScreen(userId = entry.toRoute<ProfileRoute>().userId)
}

Ayrıştırma Yaklaşımının Özeti

Kurallar bir araya getirildiğinde basittir:

  • Her özellik kendi rota türüne ve bir NavGraphBuilder genişletmesine sahip olur.
  • Özellikler niyetlerini doğrudan gezinme yerine lambda geri çağrıları aracılığıyla iletir.
  • Tüm özellikleri bilen ve geri çağrıları gerçek rotalara bağlayan tek yer :app modülüdür.
  • Bir rotanın paylaşılması gerekiyorsa onu küçük bir :api modülü aracılığıyla dışa açın.

Bu yapı özellikleri bağımsız, derleme önbelleğinden yararlanabilir ve döngülerden uzak tutar.

Hızlı Kontrol

Çok modüllü bir uygulamada :feature:home, kullanıcıyı :feature:profile modülündeki bir ekrana göndermek istiyor. Özelliklerin ayrışmış kalmasını sağlamanın en temiz yolu nedir?

Özet: Modüller Arası Gezinme

Özellikleri birbirine sıkı bağlamadan bağlamayı öğrendiniz:

  • Tek NavHost, ince :app modülünde bulunur.
  • Her özellik bir @Serializable rotasına ve bir NavGraphBuilder genişletmesine sahip olur.
  • Özellikler diğer özelliklere doğrudan gezinmek yerine geri çağrılar sağlar.
  • Bir rotayı yalnızca gerçekten gerektiğinde küçük bir :api modülü üzerinden paylaşın; derin bağlantılar ve iç içe grafikler de aynı yaklaşıma uyar.

Çok Modüllü Uygulama Mimarisi tamamlandı: artık ölçeklenebilir bir Android kod tabanını bölebilir, birbirine bağlayabilir ve içinde gezinebilirsiniz.

Başlamak ücretsiz

Yapay zeka eğitmeniyle Kotlin öğren — ücretsiz

Tarayıcında gerçek kod yaz ve çalıştır, 7/24 yapay zeka eğitmeninden anında yardım al; web'de ya da uygulamada kaldığın yerden devam et.

Kurslar
36
Dersler
152

Sıkça Sorulan Sorular

“Modüller Arası Gezinme” dersi ücretsiz mi?

Evet — “Modüller Arası Gezinme” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve Android Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. Android Academy kursu toplamda 4 dersten oluşur.

“Modüller Arası Gezinme” dersinde ne öğreneceğim?

Özellikleri sıkı bağımlılık oluşturmadan bağlayın. Android Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.

Android Academy öğrenmeye başlamak için deneyim gerekli mi?

Önceden deneyim gerekmez. CoddyKit'te Android Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 4. dersidir.

“Modüller Arası Gezinme” dersi ne kadar sürer?

Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.

Bu Android Academy dersinde kod yazıp çalıştırabilir miyim?

Evet. Her Android Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.

Bu kursun tüm dersleri

  1. Modülerleştirme Neden Kullanılır
  2. Özellik ve Çekirdek Modüller
  3. Modül Bağımlılıklarını Yönetme
  4. Modüller Arası Gezinme
← Android Academy Sayfasına Dön