En utilisant le React Navigateur de l'onglet de navigation https://reactnavigation.org/docs/navigators/tab comment faire un des boutons de l'onglet Poussez l'écran vers le haut comme modal plein écran? Je vois que le navigateur de pile a un mode=modal
option. comment utiliser ce mode lorsque je clique sur le bouton de l'onglet TakePhoto
? Cliquer dessus affiche toujours la barre d'onglets en bas.
const MyApp = TabNavigator({
Home: {
screen: MyHomeScreen,
},
TakePhoto: {
screen: PhotoPickerScreen, // how can I have this screen show up as a full screen modal?
},
});
En fait, il n'y a pas de support dans react-navigation pour changer le mode de présentation à la volée de default
à modal
(voir la discussion à ce sujet ici ). J'ai rencontré le même problème et l'ai résolu en utilisant un StackNavigator
très haut avec headerMode
réglé sur none
et mode
réglé sur modal
:
const MainTabNavigator = TabNavigator(
{
Tab1Home: { screen: Tab1Screen },
Tab2Home: { screen: Tab2Screen }
}
);
const LoginRegisterStackNavigator = StackNavigator({
Login: { screen: LoginScreen }
});
const ModalStackNavigator = StackNavigator({
MainTabNavigator: { screen: MainTabNavigator },
LoginScreenStackNavigator: { screen: LoginRegisterStackNavigator }
}, {
headerMode: 'none',
mode: 'modal'
});
Cela me permet de faire ce qui suit (en utilisant redux) dans Tab1Screen
et Tab2Screen
pour afficher la vue modale où je veux:
this.props.navigation.navigate('LoginScreenStackNavigator');
Je ne sais pas si cela est toujours pertinent pour vous, mais j'ai réussi à trouver un moyen d'y parvenir.
J'ai donc réussi à le faire fonctionner en utilisant tabBarComponent dans tabNavigatorConifg, vous pouvez empêcher la navigation par onglets de naviguer en fonction de l'index.
tabBarComponent: ({jumpToIndex, ...props, navigation}) => (
<TabBarBottom
{...props}
jumpToIndex={index => {
if (index === 2) {
navigation.navigate('camera')
}
else {
jumpToIndex(index)
}
}}
/>
)
Une fois que vous avez fait cela, ma méthode pour afficher la vue de façon modale au-dessus des vues de tabulation consistait à placer le tabnavigator à l'intérieur d'un stacknavigatior, puis à naviguer vers un nouvel écran à l'intérieur du stacknavigator.
react-navigation
Dans bottomTabNavigator a une option de navigation tabBarOnPress
que vous pouvez utiliser pour remplacer les pressions de tabulation:
https://reactnavigation.org/docs/en/bottom-tab-navigator.html#tabbaronpress
const AppContainer = createStackNavigator(
{
default: createBottomTabNavigator(
{
TAB_0: Stack0,
TAB_1: Stack1,
TAB_2: Stack2,
TAB_3: View // plain rn-view, or any old unused screen
},
{
defaultNavigationOptions: {
// other tab navigation options...
tabBarOnPress: ({ navigation, defaultHandler }) => {
if (navigation.state.key === 'TAB_3') {
navigation.navigate('tabToOpenAsModal');
} else {
defaultHandler();
}
}
}
}
),
tabToOpenAsModal: {
screen: TabToOpenAsModalScreen
}
},
{
mode: 'modal',
headerMode: 'none'
}
);
Si vous imbriquez votre navigateur d'onglets dans un navigateur de pile avec un modal, vous pouvez l'ouvrir lorsque vous appuyez sur le bouton de la barre d'onglets. Étant donné que le modal a été ouvert et non l'onglet, lorsque le modal est fermé, l'application revient à l'écran qui était visible avant d'appuyer sur l'onglet modal.
Une façon d'éliminer la barre d'onglets consiste à masquer la barre d'onglets avec visible: false
:
const MyApp = TabNavigator({
Home: {
screen: MyHomeScreen,
},
TakePhoto: {
screen: PhotoPickerScreen,
navigationOptions: {
tabBar: {
visible: false,
},
},
},
});
Cependant, cela ne semble pas déclencher de transition vers le plein écran, ce qui, je suppose, est souhaité?
Une autre option pourrait être d'envelopper PhotoPickerScreen
dans un nouveau StackNavigator et de définir ce navigateur sur mode = 'modal'.
Vous devrez peut-être déclencher la navigation vers ce modal depuis onPress sur l'onglet tab (par exemple. navigation.navigate('TakePhoto')
.)
Remarque, j'essaie de comprendre comment structurer au mieux la navigation moi-même, alors…
La troisième option, implémenter un StackNavigator en tant que parent, puis ajouter le MyApp
TabNavigator comme première route à l'intérieur de celui-ci, pourrait être la solution la plus flexible. L'écran TakePhoto serait alors au même niveau que le TabNavigator, vous permettant de l'acheminer de n'importe où.
Intéressé d'entendre ce que vous proposez!