J'ai cette structure:
bottomTabNavigator:
Lorsque l'utilisateur navigue vers l'écran B, puis passe à l'écran 1 et retourne à l'écran 2, il va directement dans B, comment puis-je réinitialiser la pile en utilisant la fonction tabBarOnPress pour forcer l'utilisateur à revenir à A?
J'utilise react-navigation 3.0.9, j'ai essayé quelques codes mais j'ai eu des erreurs et je pense que c'est dû à la version.
Ma structure de code:
const Navigator = createBottomTabNavigator({ Screen1: { screen: Screen1, navigationOptions: () => ({ tabBarOnPress... }) }, Screen2: { screen: Screen2, navigationOptions: () => ({ tabBarOnPress... }) } })
4 Réponses :
Comme indiqué par l'explication ici . vous pouvez effectuer une action de réinitialisation en cliquant sur un onglet comme celui-ci:
tabBarOnPress{() => StackActions.reset({ index: 0, actions: [NavigationActions.navigate({ routeName: 'Screen1' })], })};
Vous devriez donc faire quelque chose comme:
import { StackActions, NavigationActions } from 'react-navigation'; const resetAction = StackActions.reset({ index: 0, actions: [NavigationActions.navigate({ routeName: 'Profile' })], }); this.props.navigation.dispatch(resetAction);
Ça n'a pas marché. J'utilise maintenant Redux et componentWillReceiveProps () pour actualiser l'écran.
Il y a donc déjà une réponse, mais celle-ci pourrait aider certaines personnes. Vous pouvez utiliser la propriété de createBottomTabNavigator, resetOnBlur et la configurer sur true. Il est faux par défaut et à cause de cela, il enregistre toujours l'état dans chaque navigateur d'onglets.
Dans la nouvelle version, vous pouvez utiliser l'option unmountOnBlur pour l'écran. Il existe un petit exemple de code:
<NavigationContainer> <Tab.Navigator tabBarOptions={{ activeTintColor: ThemeConstants.mainColor, }}> <Tab.Screen name="Categories" component={CategoriesStackScreen} options={{ unmountOnBlur:true tabBarLabel: translate('Categories'), tabBarIcon: ({color, size}) => ( <Icon style={[{color: color}]} type='MaterialIcons' name='restaurant-menu'/> ), }} /> <Tab.Screen name="Info" component={InfoStackScreen} options={{ unmountOnBlur:true, tabBarLabel: translate('Info'), tabBarIcon: ({color, size}) => ( <Icon style={[{color: color}]} type='MaterialIcons' name='info-outline'/> ), }} /> <Tab.Screen name="Account" component={AccountStackScreen} options={{ unmountOnBlur:true, tabBarLabel: translate('Account'), tabBarIcon: ({color, size}) => ( <Icon style={[{color: color}]} type='Feather' name='user'/> ), }}/> <Tab.Screen name="CartStackScreen" component={CartStackScreen} options={{ unmountOnBlur:true, tabBarBadge: (quantity && quantity>0)?quantity:null, tabBarLabel: translate('Cart'), tabBarIcon: ({color, size}) => ( <Icon style={[{color: color}]} type='Feather' name='shopping-cart'/> ), }} /> </Tab.Navigator> </NavigationContainer>
Et il y a le lien qui décrit la propriété https://reactnavigation.org/docs/bottom-tab-navigator/
Solution 1:
<Tab.Navigator > <Tab.Screen name='User' component={ProfileModule} options={{ unmountOnBlur: true }} /> </Tab.Navigator>
Solution 2:
utiliser des accessoires unmountonblur dans l'écran de l'onglet comme celui-ci
import { StackActions } from '@react-navigation/native'; if(this.props.navigation.canGoBack()) { this.props.navigation.dispatch(StackActions.popToTop()); }
Je sais que cela prête à confusion, mais la balise ici devrait en fait être react-navigation car react-native-navigation est l'implémentation de la navigation native wix pour react et react-navigation est une solution de navigation basée sur JS pour react-native.
J'ai édité, merci!
Avez-vous essayé ma solution suggérée ici dans les réponses?