Навигация по ящику React Native: как открыть ящик, нажав пользовательскую кнопку в определенной сцене?

Я попытался открыть ящик, нажав следующую кнопку (скриншот) в определенной сцене. текущий статус

и вот мой код.

// App.js
import React, { Component } from 'react';
import { createAppContainer, createSwitchNavigator } from 'react-navigation'
import { createStackNavigator } from 'react-navigation-stack'
import { createDrawerNavigator } from 'react-navigation-drawer'
import SplashScreen from 'react-native-splash-screen'
import RNBootSplash from "react-native-bootsplash"

import MainCategory from './src/Scenes/MainCategory'
import SubCategory from './src/Scenes/SubCategory'
import DetailScene from './src/Scenes/DetailScene'
import Questions from './src/Scenes/Questions'
import Ruleta from './src/Scenes/Ruleta'

import CustomDrawerComponent from './src/Components/CustomDrawerComponent'

export default class MainRouter extends Component {
  componentDidMount() {
      SplashScreen.hide()
      RNBootSplash.hide({ duration: 250 })
  }
  render() {
    const StackNavigator = createStackNavigator({
      MainCategory: {screen: MainCategory},
      SubCategory: {screen: SubCategory},
      DetailScene: {screen: DetailScene},
      Questions: {screen: Questions},
      Ruleta: {screen: Ruleta},
    }, {
      initialRouteName: "MainCategory",
      headerMode: "none"
    })

    const DrawerNavigator = createDrawerNavigator({
      MainCategory: {screen: MainCategory},
    }, {
      drawerPosition: 'right',
      contentComponent: CustomDrawerComponent
    })

    const MainNavigator = createSwitchNavigator({
      Stack: StackNavigator,
      Drawer: DrawerNavigator,
    }, {
      initialRouteName: 'Stack',
      contentComponent: CustomDrawerComponent
    })

    const AppContainer = createAppContainer(MainNavigator)
    return(
      <AppContainer />
    )
  }
}
// Specific scene
import React, { Component } from 'react'
import { ScrollView, StatusBar, View, TouchableOpacity, Text, Image, Modal } from 'react-native'

import HeaderBar from '../Components/HeaderBar'

export default class Questions extends Component {
    constructor(props) {
        super(props)
        this.state = {
            headerTitle: props.navigation.getParam('headerTitle'),
            catId: props.navigation.getParam('catId'),
        }
    }

    openSideMenu = () => {
        this.props.navigation.toggleDrawer
        this.props.navigation.openDrawer()
    }

    render() {
        return (
            <View style={rootStyle}>
                <View>
                    <StatusBar hidden={false} translucent backgroundColor="transparent" barStyle="light-content" />
                    <HeaderBar title={headerTitle} onPressLeft={() => this.props.navigation.goBack()} leftShow={true} onPressRight={this.openSideMenu} rightShow={true} />
                </View>
                <ScrollView>
                    <QuestionList todoQues={todoQues} favQues={favQues} action={this.action.bind(this)} />
                </ScrollView>
            </View>
        )
    }
}

Но это не работает.

Я ожидаю результат, как на следующем снимке экрана. ожидаемый результат

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

Спасибо за ваше время!


comment
В моем коде this.props.navigation.openDrawer() не работает. Если вы знаете причину, пожалуйста, дайте мне знать, почему это не работает.   -  person Derek Yang    schedule 15.12.2019
comment
любая ошибка, которую вы получаете, или просто не работает   -  person Gaurav Roy    schedule 15.12.2019
comment
Я исправил это, но все еще есть некоторые ошибки. Я импортировал следующий код, и теперь он работает. import { DrawerActions } from 'react-navigation-drawer' ... this.props.navigation.dispatch(DrawerActions.openDrawer()); На данный момент ящик открыт, но навигация выполняется до того, как я щелкну элементы ящика в ящике.   -  person Derek Yang    schedule 15.12.2019


Ответы (1)


Прежде всего, вместо вызова метода this.props.navigation.toggleDrawer() вызовите метод this.props.navigation.dispatch(DrawerActions.openDrawer()). Вам также необходимо импортировать DrawerActions, чтобы это работало. И удалите первую функцию, которую вы вызвали в своей функции openSideMenu, потому что вам не нужен this.props.navigation.openDrawer().

person kodak    schedule 15.12.2019
comment
Спасибо за Ваш ответ. Я изменил код, как вы сказали, и теперь opendrawer работает. Моя проблема в том, что когда ящик открыт, навигация выполняется автоматически, хотя я не нажимаю ни на какие элементы. Я проверил код и попытался удалить все параметры initialRouteName. Но все же автонавигация сделана. (в этом случае маршрут, по которому осуществляется навигация, является первым параметром маршрутизации в drawerNavigator. В приведенном выше коде основная категория выполняется автоматически.) - person Derek Yang; 16.12.2019
comment
Удалите методы навигации (StackNavigator, DrawerNavigator, Switch Navigator) из метода рендеринга и поместите их за его пределы. Ваш код должен выглядеть примерно так: export default class AppNavigator extends React.Component { render() { return <AppContainer />; } } - person kodak; 17.12.2019
comment
Я пробовал как вы сказали, но автонавигация все равно есть. Я собираюсь опубликовать еще один вопрос по этой проблеме. Спасибо за добрый ответ. - person Derek Yang; 18.12.2019