Как сделать кнопку TabNavigator нажать модальный экран с навигацией React

использование вкладки навигации React navigator https://reactnavigation.org/docs/navigators/tab Как сделать одну из кнопок вкладки, чтобы нажать экран вверх как полноэкранный модальный? Я вижу, что у навигатора стека есть . как получить этот режим для использования при нажатии на TakePhoto кнопка tab? При нажатии на него в настоящее время по-прежнему отображается панель вкладок внизу.

const MyApp = TabNavigator({
  Home: {
    screen: MyHomeScreen,
  },
  TakePhoto: {
    screen: PhotoPickerScreen, // how can I have this screen show up as a full screen modal?
  },
});

4 ответов


на самом деле, нет никакой поддержки в реагировать-навигации чтобы изменить способ презентации на лету от default to modal (см. обсуждение об этом здесь). Я столкнулся с той же проблемой и решил ее, используя очень top StackNavigator С headerMode значение none и mode значение 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'
});

это позволяет мне сделать следующее (используя redux) в Tab1Screen и Tab2Screen чтобы вызвать модальный вид, откуда бы я ни хочу:

this.props.navigation.navigate('LoginScreenStackNavigator');

Не уверен, что это все еще актуально для вас, но мне удалось найти, чтобы достичь этого.

таким образом, мне удалось заставить его работать с помощью tabBarComponent внутри tabNavigatorConifg, вы можете остановить навигацию вкладки от навигации в зависимости от индекса.

   tabBarComponent: ({jumpToIndex, ...props, navigation}) => (
        <TabBarBottom
            {...props}
            jumpToIndex={index => {
                if (index === 2) {
                    navigation.navigate('camera')
                }
                else {
                    jumpToIndex(index)
                }
            }}
        />

    )

Как только вы это сделаете, мой метод отображения вида модально поверх представлений вкладок состоял в том, чтобы поместить tabnavigator внутри stacknavigatior, а затем просто перейти к новому экрану внутри о стакнавигаторе.


один из способов сделать панель вкладок уйти, чтобы скрыть панель вкладок с visible: false:

const MyApp = TabNavigator({
  Home: {
    screen: MyHomeScreen,
  },
  TakePhoto: {
    screen: PhotoPickerScreen,
    navigationOptions: {
      tabBar: {
        visible: false,
      },
    },
  },
});

однако, это, похоже, не вызывает никакого перехода к полноэкранному режиму, что, я думаю, желательно?

другой вариант может быть обернуть PhotoPickerScreen внутри нового StackNavigator и установите этот навигатор в mode= 'modal'.

возможно, вам придется каким-то образом вызвать навигацию к этому модальному от onPress на tabItem (например. navigation.navigate('TakePhoto').)

примечание, Я пытаюсь обернуть моя голова вокруг того, как лучше всего структурировать навигацию, так что...

третий вариант, Реализация StackNavigator в качестве родителя, а затем добавление MyApp TabNavigator как первый маршрут внутри него, может быть самым гибким решением. Тогда экран TakePhoto будет на том же уровне, что и TabNavigator, позволяя вам направлять к нему откуда угодно.

интересно услышать, что вы придумали!


документы в некоторых областях неоднородны, но вот он:

    export default class HomeScene extends Component {

        static navigationOptions = {
        title: 'foo',
        header:{
                    visible: true
                }
        }
        ....
      }