web-dev-qa-db-fra.com

Renvoyez les données au fragment précédent en utilisant Android Navigation

J'ai commencé à utiliser Android Composants d'architecture (navigation et Safe Args, View Models) avec la bibliothèque Koin.

Actuellement, j'ai un problème avec le passage d'arguments entre deux fragments - je dois passer une valeur de chaîne du fragment A au fragment B, modifier cette valeur dans le fragment B et la renvoyer au fragment A.

J'ai trouvé une solution possible à mon problème - les modèles de vue partagée. Malheureusement, cette approche a un problème car je peux passer et modifier des valeurs entre les écrans, mais lorsque le fragment A navigue vers une autre destination, la valeur dans le modèle de vue partagée est toujours stockée et non effacée.

Existe-t-il une solution différente pour passer et modifier des données entre les fragments dans Android Navigation? Je veux éviter d'effacer cette seule valeur à la main (lorsque le fragment A est détruit).

11
rubin94

Android vient de publier une solution pour cela; Passage de données entre destinations ( Navigation 2.3.0-alpha02 ), fondamentalement, dans le fragment A, vous observez les changements dans une variable et dans le fragment B, vous modifiez cette valeur avant d'exécuter popBackStack().

Fragment A:

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
val navController = findNavController();
// We use a String here, but any type that can be put in a Bundle is supported
navController.currentBackStackEntry?.savedStateHandle?.getLiveData("key")?.observe(
    viewLifecycleOwner) { result ->
    // Do something with the result.
  }
}

Fragment B:

navController.previousBackStackEntry?.savedStateHandle?.set("key", result)
navController.popBackStack()
1
zgluis