Réinitialiser la pile de navigation pour l'écran d'accueil (React Navigation et React Native))
j'ai un problème avec la navigation de Réagir De Navigation et Réagir Natif. Il s'agit de rétablir la navigation et de revenir à l'écran d'accueil.
j'ai construit un StackNavigator à l'intérieur D'un DrawerNavigator, et la navigation entre l'écran d'accueil et les autres écrans fonctionne. Mais le problème, c'est que la pile de navigation grandit et grandit. Je ne sais pas comment enlever un écran de la pile.
par exemple lorsque l'on passe de l'écran d'accueil à l'écran l'écran paramètres, puis à l'écran de saisie et enfin de nouveau à l'écran d'accueil l'écran d'accueil est deux fois dans la pile. Avec le bouton back Je ne sors pas de l'application, mais de nouveau à l'écran d'entrée.
en sélectionnant à nouveau le bouton home, une réinitialisation de la pile serait bien, mais je ne sais pas comment faire. Ici quelqu'un a essayé d'aider une autre personne avec un problème similaire, mais la solution n'a pas fonctionné pour moi.
const Stack = StackNavigator({
Home: {
screen: Home
},
Entry: {
screen: Entry
},
Settings: {
screen: Settings
}
})
export const Drawer = DrawerNavigator({
Home: {
screen: Stack
}},
{
contentComponent: HamburgerMenu
}
)
et ceci est un simple exemple du tiroir écran
export default class HamburgerMenu extends Component {
render () {
return <ScrollView>
<Icon.Button
name={'home'}
borderRadius={0}
size={25}
onPress={() => { this.props.navigation.navigate('Home')}}>
<Text>{I18n.t('home')}</Text>
</Icon.Button>
<Icon.Button
name={'settings'}
borderRadius={0}
size={25}
onPress={() => { this.props.navigation.navigate('Settings')}}>
<Text>{I18n.t('settings')}</Text>
</Icon.Button>
<Icon.Button
name={'entry'}
borderRadius={0}
size={25}
onPress={() => { this.props.navigation.navigate('Entry')}}>
<Text>{I18n.t('entry')}</Text>
</Icon.Button>
</ScrollView>
}
}
j'espère que vous pourrez m'aider. C'est une partie essentielle de la navigation et une solution serait génial!
7 réponses
C'est Comment je le fais :
reset(){
return this.props
.navigation
.dispatch(NavigationActions.reset(
{
index: 0,
actions: [
NavigationActions.navigate({ routeName: 'Menu'})
]
}));
}
au moins remplacer "Menu" par "Accueil". Vous pouvez également adapter cette.accessoires de jeu.navigation vers votre implémentation.
Voici comment je le fais:
import { NavigationActions } from 'react-navigation'
this.props.navigation.dispatch(NavigationActions.reset({
index: 0,
key: null,
actions: [NavigationActions.navigate({ routeName: 'ParentStackScreen' })]
}))
la partie importante est
key: null
.
qui essuie la pile tout en naviguant à partir d'un enfant navigateur mère navigateur.
le Faire que si vous obtenez cette erreur:
Pour les animations, j'utilise
// https://github.com/oblador/react-native-animatable
import * as Animatable from 'react-native-animatable'
je contrôle toutes les animations moi-même. Les mettre sur composant que vous souhaitez en l'enveloppant avec <Animatable.View>
.
pour utiliser Back, vous devez trouver la clé unique associée au chemin. À l'intérieur de votre réducteur de navigation, vous pouvez rechercher l'état existant pour trouver la première route sur la pile en utilisant ce chemin, saisir sa clé et passer que pour revenir. Retour va ensuite naviguer à l'écran avant le chemin que vous avez donné.
let key;
if (action.payload) {
// find first key associated with the route
const route = action.payload;
const routeObj = state.routes.find( (r) => r.routeName === route );
if (routeObj) {
key = { key: routeObj.key };
}
}
return AppNavigator.router.getStateForAction( NavigationActions.back( key ), state );
La Réponse est createSwitchNavigator, ceux qui ne mettent pas en place votre navigation. Ajoutez votre écran d'auteur / navigateur dans un navigateur createSwitchNavigator avec l'écran d'accueil/la pile.
avec cela, lorsque vous naviguez de la maison pour vous connecter, les piles ne sont pas conservées.
Pour en savoir plus sur elle https://reactnavigation.org/docs/en/auth-flow.htmlLoginStack
pour les nouvelles versions de react-navigation vous devez utiliser StackActions pour réinitialiser la pile, voici un morceau de code:
// import the following
import { NavigationActions, StackActions } from 'react-navigation'
// at some point in your code
resetStack = () => {
this.props
.navigation
.dispatch(StackActions.reset({
index: 0,
actions: [
NavigationActions.navigate({
routeName: 'Home',
params: { someParams: 'parameters goes here...' },
}),
],
}))
}
dans votre StackNavigator et DrawerNavigator vous avez utilisé la maison comme une clé, et je pense qu'il doit être unique et c'est pourquoi il crée le problème. Pouvez-vous s'il vous plaît essayer de remplacer la maison avec la pile à l'intérieur de votre DrawerNavigator.
Espérons que cela aide :)
l'action pop vous ramène à un écran précédent dans la pile. Le N param vous permet de spécifier le nombre d'écrans à afficher.
n-nombre - le nombre d'écrans à visionner.
importer { StackActions } à partir de 'réagir de la navigation';
const popAction = StackActions.pop({ n: 1, });
c'.accessoires de jeu.navigation.expédition (popAction);