Skip to content

MateuszMroz/Nav3Sample

Repository files navigation

Navigation 3 Sample - GOTOWE! ✅

Projekt skompilowany pomyślnie!

📱 Struktura projektu:

Nav3Sample/
├── libraries/navigation      ✅ Abstrakcja nawigacji (niezależna od frameworka)
│   ├── Route.kt             - Interface NavKey
│   ├── NavAction.kt         - Sealed class akcji nawigacji  
│   ├── NavActionsEmitter.kt - Channel-based emiter
│   ├── NavActionsEffect.kt  - Composable obserwujący akcje
│   └── AppNavigator.kt      - Wrapper na NavBackStack
│
├── core/
│   ├── domain/              ✅ Modele, interfejsy, use case'y
│   │   ├── model/Order.kt
│   │   ├── repository/OrderRepository.kt
│   │   ├── usecase/GetOrdersUseCase.kt
│   │   ├── usecase/GetOrderByIdUseCase.kt
│   │   └── constants/AppConfig.kt
│   │
│   └── data/                ✅ Implementacje
│       └── repository/OrderRepositoryImpl.kt (z mock danymi)
│
├── features/order/          ✅ MVI pattern
│   └── presentation/
│       ├── OrderListContract.kt (State/Intent/Effect)
│       ├── OrderListViewModel.kt
│       ├── OrderDetailContract.kt
│       └── OrderDetailViewModel.kt
│
├── compose/order/           ✅ Ekrany Compose
│   ├── OrderListScreen.kt
│   └── OrderDetailScreen.kt
│
└── app/                     ✅ Integracja
    ├── di/AppModule.kt      - Koin DI
    ├── navigation/
    │   ├── routes/          - OrderListRoute, OrderDetailRoute, AddOrderRoute
    │   └── AppNavGraph.kt   - Graf nawigacji
    ├── constants/AppConfigImpl.kt
    ├── App.kt               - Application z Koin
    └── MainActivity.kt      - Entry point

✨ Kluczowe cechy implementacji:

1. Abstrakcja nawigacji - łatwa wymiana frameworka

interface AppNavigator {
    val backStack: AppBackStack
    fun navigateTo(route: Route)
    fun navigateUp()
    fun popBackTo(route: Route, inclusive: Boolean)
}

2. MVI w features

// State
data class OrderListState(
    val orders: List<Order>,
    val isLoading: Boolean,
    val error: String?
)

// Intent
sealed interface OrderListIntent {
    data object LoadOrders : OrderListIntent
    data class OnOrderClick(val orderId: String) : OrderListIntent
}

// Effect
sealed interface OrderListEffect {
    data class NavigateToOrderDetail(val orderId: String) : OrderListEffect
}

3. Type-safe routes z kotlinx.serialization

@Serializable
data object OrderListRoute : Route

@Serializable
data class OrderDetailRoute(val orderId: String) : Route

4. Koin DI

val appModule = module {
    single<OrderRepository> { OrderRepositoryImpl() }
    factory { GetOrdersUseCase(get()) }
    factory { NavActionsEmitter() }
    viewModel { OrderListViewModel(get(), get()) }
}

5. Navigation 3 z BackStack jako MutableList

val backStack = rememberNavBackStack(OrderListRoute)
val navigator = Nav3AppNavigator(backStack)

// Nawigacja przez dodawanie do listy
navigator.navigateTo(OrderDetailRoute(orderId))

// Cofanie przez usuwanie z listy  
navigator.navigateUp()

🔧 Technologie:

  • Kotlin 2.2.21
  • Navigation 3 (1.1.0-alpha05)
  • Jetpack Compose
  • Koin (Dependency Injection)
  • kotlinx.serialization
  • Kotlin Coroutines & Flow
  • MVI Pattern
  • Clean Architecture

📊 Features:

✅ Lista zamówień z mock danymi
✅ Szczegóły zamówienia
✅ Nawigacja typu type-safe
✅ Zarządzanie stanem (MVI)
✅ Dependency Injection (Koin)
✅ Modularyzacja
✅ Abstrakcja nawigacji

🚀 Uruchomienie:

./gradlew assembleDebug
# lub
./gradlew installDebug

📝 Uwagi implementacyjne:

Navigation 3 API

Ze względu na to, że Navigation 3 (1.1.0-alpha05) nie ma pełnej dokumentacji API dla NavDisplay, użyłem prostszego podejścia:

  • Manual rendering na podstawie backStack.lastOrNull()
  • Zamiast NavDisplay z entryProvider (które nie jest dostępne w tej wersji)

Dlaczego to działa:

  1. NavBackStack jest MutableList<NavKey>
  2. ✅ Obserwujemy zmiany przez recomposition
  3. ✅ Wszystkie ViewModels działają poprawnie z Koin
  4. ✅ Nawigacja działa przez backStack.add() i backStack.removeLast()

Przyszłe ulepszenia:

Gdy Navigation 3 będzie miał stabilną wersję z pełnym API, można dodać:

  • Animacje przejść
  • NavDisplay z entryProvider
  • NavEntry decorators dla lifecycle
  • Shared element transitions

✅ Wszystko gotowe do użycia!

Projekt kompiluje się bez błędów i jest gotowy do uruchomienia na emulatorze/urządzeniu.

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages