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!

22
demandé sur Val 2017-03-29 13:24:26

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.

36
répondu Robin Dehu 2017-03-30 14:49:05

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:

enter image description here

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>.

15
répondu agm1984 2017-10-30 20:45:08

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 );
3
répondu peterorum 2017-04-26 07:31:39

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

1
répondu Nelson Bass 2018-07-19 09:42:42

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...' },
       }),
     ],
   }))
}
1
répondu Gustavo Garcia 2018-07-26 18:47:01

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 :)

0
répondu Vijay Suryawanshi 2017-03-29 13:39:10

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);

0
répondu Kosalram 2018-07-30 10:12:23