Jusqu'à présent, je suis en mesure de naviguer dans les boîtes de dialogue et de revenir en utilisant uniquement le composant de navigation. Le problème est que je dois faire des choses dans la boîte de dialogue et retourner le résultat au fragment d'où la boîte de dialogue a été appelée.
Une façon consiste à utiliser le modèle de vue partagé. Mais pour cela, je dois utiliser .of (activité) qui laisse mon application avec un singleton occupant de la mémoire, même lorsque je n'en ai plus besoin.
Une autre façon consiste à remplacer la méthode show (fragmentManager, id), à obtenir l'accès au gestionnaire de fragments et à partir de celui-ci, l'accès au fragment précédent, qui pourrait ensuite être défini comme ciblefragment. J'ai utilisé l'approche targetFragment avant où j'implémenterais une interface de rappel, donc ma boîte de dialogue pourrait informer targetFragment du résultat. Mais dans l'approche du composant de navigation, il semble hacky et peut cesser de fonctionner à un moment ou à un autre.
D'autres façons de faire ce que je veux? Peut-être qu'il existe un moyen de résoudre le problème lors de la première approche?
Dans Navigation 2.3.0-alpha02 et supérieur, NavBackStackEntry donne accès à un SavedStateHandle. Un SavedStateHandle est une carte de valeurs-clés qui peut être utilisée pour stocker et récupérer des données. Ces valeurs persistent pendant la mort du processus, y compris les modifications de configuration, et restent disponibles via le même objet. En utilisant le SavedStateHandle donné, vous pouvez accéder aux données et les transmettre entre les destinations. Ceci est particulièrement utile comme mécanisme pour récupérer des données à partir d'une destination après leur extraction de la pile.
Pour renvoyer des données à la destination A à partir de la destination B, configurez d'abord la destination A pour écouter un résultat sur son SavedStateHandle. Pour ce faire, récupérez NavBackStackEntry à l'aide de l'API getCurrentBackStackEntry (), puis observez les LiveData fournies par SavedStateHandle.
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.
}
}
Dans Destination B, vous devez définir le résultat sur le SavedStateHandle de la destination A à l'aide de l'API getPreviousBackStackEntry ().
navController.previousBackStackEntry?.savedStateHandle?.set("key", result)