Как реализовать навигатор стека реакции-навигации / нижней вкладки с использованием кнопок возврата вместо вкладок для навигации?

Я реализовал собственное приложение для реагирования, которое в настоящее время не использует никаких типов навигации. Я хочу реализовать реагирующую навигацию, но изо всех сил пытаюсь воссоздать то, что у меня уже есть. Ниже я добавил несколько изображений, чтобы показать пример того, что у меня сейчас есть без реакции-навигации. Я хотел бы это точно воспроизвести с помощью реакции-навигации.

Это домашний экран: https://ibb.co/XWxCpwt

Это правая вкладка (левая кнопка просмотра вкладки меняется на кнопку возврата): https://ibb.co/XzFB8v8

Это левая вкладка (правая кнопка просмотра вкладки меняется на кнопку возврата): https://ibb.co/zP2ZBK5

Я хочу прояснить, что центральная нижняя кнопка не имеет ничего общего с отображением центрального вида. У него совершенно другой функционал. Вот почему я хотел бы, чтобы кнопки возврата работали именно так.

Это небольшой фрагмент из моего файла App.js. Без реакции-навигации все, что находится выше экспортированного класса, было бы закомментировано. Я не потратил много времени, пытаясь понять это, поскольку мне уже не повезло, пытаясь реализовать с помощью response-native-navigation. Любая помощь будет оценена по достоинству!

const TabNavigator = createBottomTabNavigator({
  Community: Community,
  Root: Root,
  Network: Network
});

const RootStack = createStackNavigator({
    Root: Root
});

const Navigation = createAppContainer(TabNavigator);

// Everything above this line would normally be commented out and <Root /> would
// be inside the exported class instead of <Navigation />

export default class App extends Component {
  render() {

    return (
        <Provider store={persistStore.store} >
            <PersistGate loading={null} persistor={persistStore.persistor}>
                <Navigation />
            </PersistGate>
        </Provider>
    );
  }
}

Я обновил свой App.js. Это самое близкое, что мне удалось до сих пор. Следующие необходимые шаги - настроить вкладки так, чтобы при щелчке не отображалось представление, которое в настоящее время связано с вкладкой, а вместо этого нужно переключиться на кнопки возврата, чтобы вернуть пользователя на главный экран (корневой компонент). Желаемый вид навигации этого приложения - создать ощущение, будто три вида расположены рядом. Пользователь может перемещаться только по одному представлению за раз и не может переходить между ними.

const TabNavigator = createBottomTabNavigator({
    Community: Community,
    Home: Root,
    Network: Network
});

const RootStack = createStackNavigator({
    Root: {
        screen: TabNavigator,
        navigationOptions: {
            headerLeft: () => <ProfileSidebarButton />,
            headerTitle: () => <Search />,
            headerRight: () => <MapFilterButton />
        }
    }
});


const Navigation = createAppContainer(RootStack);

1 ответ

Я смог решить мою проблему с конфигурацией с помощью этого решения. Ключевым моментом было использование tabBarComponent для отображения моей настраиваемой панели вкладок. Затем я передал опору навигации кнопкам. Затем я реализовал свою собственную логику навигации, используя this.props.nav.navigate("Сообщество") (в моем случае я передал свойство навигации как "nav"). Кажется, это работает хорошо, есть небольшая проблема с рендерингом Rootstack, который немного поднимается и скользит вниз каждый раз при переходе к нему.

const HomeStack = createDrawerNavigator({
    Root: Root,
    Profile: Profile
},{
    initialRouteName: 'Root',
    drawerWidth: SCREEN_WIDTH,
    contentComponent: props => (
        <ProfileSidebar drawerNavigator={props.navigation}/>
    )
});

const TabNavigator = createBottomTabNavigator({
    Community: {
        screen: Community
    },
    Home: HomeStack,
    Network: {
        screen: Network
    }
},{
    initialRouteName: 'Home',
    tabBarComponent: props => (
        <View style={styles.nocturnFooter}>
            <NavButton nav={props.navigation}/>
            <NocturnButton />
            <CommunityButton nav={props.navigation}/>
        </View>
    ),
});

const RootStack = createStackNavigator({
    Root: {
        screen: TabNavigator,
        navigationOptions: ({ navigation }) => ({
            headerLeft: () => <ProfileSidebarButton />,
            headerTitle: () => <Search />,
            headerRight: () => <MapFilterButton />,
            headerTransparent: navigation.state.index == 1 ? true : false,
            headerStyle: navigation.state.index != 1 ? {
                backgroundColor: '#000000'
            } : {}
        })
    }

});


const Navigation = createAppContainer(RootStack);