Sobes.tech
Junior — Middle

Jakimi metodami można zrealizować przekazywanie danych między ekranami podczas korzystania z nawigacji Jetpack Compose?

sobes.tech AI

Odpowiedź od AI

W Jetpack Compose Navigation istnieje kilka podejść do przekazywania danych między ekranami:

  1. Argumenty nawigacji
    • Podczas deklarowania trasy można określić parametry, które będą przekazywane do następnego ekranu.
    • Obsługiwane są typy prymitywne i łańcuchy znaków.
    • Przykład przekazywania id:
navController.navigate("detail_screen/$itemId")

composable("detail_screen/{itemId}") { backStackEntry ->
    val itemId = backStackEntry.arguments?.getString("itemId")
    DetailScreen(itemId)
}
  1. Shared ViewModel

    • Użycie ViewModel, które żyje na poziomie grafu nawigacji lub aktywności.
    • Oba ekrany mają dostęp do tego samego egzemplarza ViewModel i mogą wymieniać dane przez niego.
  2. Stan (State Hoisting)

    • Przekazywanie stanu przez parametry funkcji ekranów.
    • Odpowiednie dla małych danych i gdy ekrany są w tym samym komponencie.
  3. Zapisywanie danych w NavBackStackEntry.savedStateHandle

    • Można umieścić dane w savedStateHandle przed powrotem do poprzedniego ekranu.
    • Umożliwia to przekazywanie danych z powrotem.

Przykład użycia savedStateHandle:

// Przesyłanie danych z powrotem
navController.currentBackStackEntry?.savedStateHandle?.set("key", value)

// Odbieranie danych w poprzednim ekranie
val savedStateHandle = navController.previousBackStackEntry?.savedStateHandle
val value = savedStateHandle?.get<String>("key")

Wybór metody zależy od typu i objętości danych, a także od architektury aplikacji.