J'essaie de comprendre comment réinitialiser dans la pile imbriquée ceci mon code
const resetAction = StackActions.reset({ index: 0, key: null, actions: [NavigationActions.navigate({ routeName: 'AuthStack' })], }); this.props.navigation.dispatch(resetAction);
TabStack
const resetAction = StackActions.reset({ index: 0, actions: [NavigationActions.navigate({ routeName: 'AuthStack' })], }); this.props.navigation.dispatch(resetAction);
Je veux comprendre comment faire une réinitialisation par exemple:
reset from UserProfile to TabStack (in AppStack) to AuthStack
3 Réponses :
Essayez de le définir sur AppStack
, car de toute façon, il va rediriger vers GeneralStack
car vous l'avez en tant que initialRouteName
dans AppStack
const resetAction = StackActions.reset({ index: 0, key: null, actions: [NavigationActions.navigate({ routeName: 'App' })], }); this.props.navigation.dispatch(resetAction);
Que voulez-vous dire? Je veux réinitialiser de userProfile de tabstack à screenA de authstack .. comment faire cela?
Mais en question, vous essayez de le réinitialiser sur GeneratStack
au lieu de AuthStack
J'essaie de faire quelques réinitialisations, la dernière que je vous demande est d'implémenter la déconnexion .. une idée?
Dans ce cas, vous pouvez le réinitialiser directement sur Auth
J'ai essayé de réinitialiser de UserProfile de tabStack à screenA de AuthStack avec ce code pastebin.com/hvJ7Mp7b . J'obtiens la même erreur "erreur: erreur: il n'y a pas d'itinéraire défini pour la clé Auth. Doit être l'un des" TabStack, .... "
@ J'édite mon message avec de vrais noms pour le rendre plus facile à comprendre. vérifier à nouveau - Adir Zoari il y a 9 minutes Supprimer
@RaviRupareliya, dans mon cas, MainNav est StackNav, j'ai également un switchNav à l'intérieur, puis un StackNav dans le switchNav. Je veux reposer le stackNav interne dans certaines situations, mais cela échoue. il semble que la pile externe va se réinitialiser et parce que je passe l'un des cheminName interne de StackNav, il ne peut pas le trouver sur stackNav externe. J'ai un fichier util NavigationService comme vous le publiez dans votre réponse. avez-vous une idée comment puis-je résoudre ce problème?
Vous pouvez faire ce qui suit, pour réinitialiser à authStack
,
créer une action de réinitialisation comme suit,
const AppStack = createStackNavigator( { TabStack, SearchResult, BusinessDetail, BusinessMap, MakeAppointment, TermsAndConditions, AuthStack <---Insert THIS },
et également ajouter le AuthStack dans appStack, ou la pile à partir de laquelle vous appelez le code ci-dessus.
Par exemple, si vous appelez ceci depuis votre pile d'applications, ajoutez la ligne suivante comme route dans votre pile d'applications
const resetAction = StackActions.reset({ index: 0, actions: [NavigationActions.navigate({ routeName: "AuthStack" })], key: null }); this.props.navigation.dispatch(resetAction);
Cela fonctionne pour moi lorsque je me déconnecte.
Je connais ce genre de méthode mais je ne pense pas que ce soit la bonne façon ... parce que si je veux réinitialiser dans des piles plus complexes, je dois toujours le déclarer au même niveau de pile ...
Votre resetAction
échoue car vous l'envoyez sur TabStack
(car vous appelez this.props.navigation.dispatch
sur UserProfile
, si je vous comprends bien). Vous devez plutôt envoyer resetAction
à votre MainStack
. Ce fil de discussion a suggéré des moyens pour y parvenir. Et aussi, voici ma solution préférée, car je n'ai pas à passer d'accessoires autour des navigateurs ou à appeler plusieurs actions imbriquées avec cela.
navigationService.js
avec le contenu suivant (pour garder votre navigateur de premier niveau comme référence) function navigateAndReset(routeName, params) { _navigator.dispatch( StackActions.reset({ index: 0, actions: [ NavigationActions.navigate({ routeName, params, }), ], }) ); }
App.js
ou tout autre fichier dans lequel vous affichez votre MainStack
, procédez comme suit pour définir la référence NavigationService.navigateAndReset('Auth', {...yourParamsIfAny}); // 'Auth' because you named it that way in your 'MainStack'
AuthStack
(ou toute autre pile de votre MainStack
), il vous suffit d'importer NavigationService
et d'appeler
import NavigationService from './navigationService'; ... render() { return ( ... <MainStack ref={navigatorRef => { NavigationService.setTopLevelNavigator(navigatorRef); }} /> ... ) }
=================================== ========================================
La solution précédente, dans navigationService.js
, est pour StackNavigator
comme MainStack
import { NavigationActions, StackActions } from 'react-navigation'; let _navigator; function setTopLevelNavigator(navigatorRef) { _navigator = navigatorRef; } function navigateMainNavigator(routeName, params) { _navigator.dispatch( NavigationActions.navigate({ routeName, params, }), ); } // add other navigation functions that you need and export them export default { setTopLevelNavigator, navigateMainNavigator, };
hey wicky, ça sonne comme un excellent moyen de faire ça! J'utilise avec mobx donc je l'ai fait dans mon magasin, je copie une partie de mon code ici, vous pouvez voir pastebin.com/KtnMAXYy J'ai également imprimé la référence pour voir ce qu'elle contient et voir toutes ses propriétés. mais j'ai toujours la même erreur .. peut-être que quelque chose me manque ..
Hey Adir, je ne connais pas mobx. Mais essayez de faire un conosle.log (this.main_navigation_ref)
sur votre fonction resetMainStack
, et vérifiez si vous êtes sur le bon navigateur. Essayez de rechercher les itinéraires du navigateur, cette image pourrait vous aider
vous pouvez voir le console.log ici imgur.com/a/tWhfMHA il me montre le mainStack
Ahh, je viens de réaliser que votre MainStack
est en fait un SwitchNavigator
. Dans ce cas, vous n'avez pas besoin de l'action StackActions.reset
. Seul le NavigationActions.navigate
fera l'affaire. J'ai mis à jour ma réponse ci-dessus
exactement ce dont j'ai besoin !!!! quelle est la différence entre stack actions.reset to NavigationActions?
Gald ça aide. StackActions.reset
(avec index: 0
) consiste à réinitialiser la pile de votre StackNavigator
, de sorte que lorsque vous poussez un nouvel écran en utilisant NavigationActions.navigate
, le nouvel écran sera le premier écran du StackNavigator
. Sans StackActions.reset
, il poussera le nouvel écran au-dessus de la pile, que vous pouvez toujours revenir à l'écran précédent en utilisant le bouton retour
ou glisser gauche
. Puisque votre MainStack
est un SwitchNavigator
mais pas un StackNavigator
, vous n'avez pas besoin de réinitialiser la pile.
continuons cette discussion dans le chat .
Double possible de React Native en naviguant entre Nested StackNavigator
@JaydeepGalani J'ai essayé cette solution, ne fonctionnant pas, elle montre la même erreur.
Vérifiez le nom de votre route, il devrait être
Auth
au lieu deAuthStack
comme déclaration :) Et réinitialiser avec la clé null fonctionnera car cela réinitialisera le navigateur racine.J'ai fait comme vous pouvez le voir ici, même erreur pastebin.com/hvJ7Mp7b