AppRouter

object AppRouter

Centralny singleton zarządzający stanem nawigacji w całej aplikacji.

AppRouter jest pojedynczym źródłem prawdy (Single Source of Truth) dla nawigacji i zapewnia globalny dostęp do funkcji nawigacyjnych z dowolnego miejsca w aplikacji.

Architektura

  • Zakładki: Główne sekcje aplikacji

  • Stosy nawigacji: Każda zakładka ma własny stos ekranów z możliwością nawigacji w przód/tył

  • Reaktywny stan: UI obserwuje zmiany stanu przez StateFlow

  • Bezpieczeństwo: Zabezpieczenia przed nieprawidłowym stanem (np. cofanie z ekranu głównego)

Przykłady użycia

Przełączanie zakładek

AppRouter.switchToTab(1u) // Przejdź do zakładki o indexie  1

Nawigacja do nowego ekranu

val formScreen = GameFormScreen(gameId = 123)
AppRouter.navigateTo(formScreen)

Powrót do poprzedniego ekranu

AppRouter.goBack() // Bezpieczne - nie cofnie z ekranu głównego zakładki

Obserwowanie stanu w UI

@Composable
fun MyComponent() {
val navState by AppRouter.state.collectAsState()
navState?.let { state ->
Text("Aktywna zakładka: ${state.activeTab.options.title}")
}
}

Inicjalizacja

Router musi być zainicjalizowany przed użyciem, zazwyczaj w MainScreen:

val tabs = listOf(AsianMediaTab(), GameTab(), SettingsTab())
AppRouter.initialize(tabs)

Bezpieczeństwo typów

  • goBack() nie pozwala opuścić ekranu głównego zakładki

  • Wszystkie operacje są null-safe względem stanu inicjalizacji

See also

Interfejs implementowany przez wszystkie ekrany

Interfejs implementowany przez wszystkie zakładki

Model danych stanu nawigacji

Properties

Link copied to clipboard
private val _state: MutableStateFlow<AppNavigationState?>
Link copied to clipboard
private lateinit var initialTabs: List<Tab>
Link copied to clipboard
val state: StateFlow<AppNavigationState?>

Reaktywny stan nawigacji obserwowany przez UI.

Link copied to clipboard
private lateinit var tabsById: Map<String, Tab>

Functions

Link copied to clipboard
fun goBack()

Cofa do poprzedniego ekranu na aktywnej zakładce.

Link copied to clipboard
fun initialize(tabs: List<Tab>)

Inicjalizuje router z podaną listą zakładek.

Link copied to clipboard
fun navigateTo(screen: Screen)

Nawiguje do nowego ekranu na aktywnej zakładce.

fun navigateTo(screen: Screen, tabId: String)

Atomowo przełącza zakładkę i nawiguje do nowego ekranu, używając ID zakładki.

Link copied to clipboard
fun switchToTab(tabId: String)

Przełącza na zakładkę na podstawie jej tekstowego ID. Wygodne do użytku z zewnątrz (np. API, event bus).

fun switchToTab(tab: Tab)

Przełącza na zakładkę na podstawie jej obiektu.