Ваш навигационный объект не определен, поскольку вы не предоставляете ему объект.
Вы можете включить объект navigation
двумя способами:
- Объявите объект в
StackNavigator
class - Pass
navigation
явно поддерживает.Например - в index.js
вам нужно изменить <Header />
на <Header navigation={this.props.navigation} />
.Итак, здесь вы предоставляете ему необходимые свойства для выполнения действия navigate
.
РЕДАКТИРОВАТЬ
Фактическая проблема здесь,
<Root style={ globalContainer }>
<Header />
<Screen />
</Root>
Вы определяете свои маршруты позже, но вызываете свой Header
экран раньше.Точно, объект navigation
- это undefined
в самом index.js
.
Что вам нужно сделать, перечислить index.js
в классе StackNavigator
в качестве первого объекта, так что он будет вызванпервый.Итак, ваш index.js будет выглядеть примерно так:
<Root style={ globalContainer }>
<Header navigation={this.props.navigation} /> //navigation object will be defined here
</Root>
Также, как я вижу, вы сделали ваш DrawerNavigator
своим RootStack.Я хотел бы предложить что-то другое. Вы определяете StackNavigator
в качестве корневого стека, а затем включаете в него навигацию по ящикам.
Что-то в строках -
export const RootStack = createStackNavigator({
Index: //your index.js screen declaration
Drawer: //drawer navigator object
ItemDetails: {
screen: ItemDetailsScreen
}
},
РЕДАКТИРОВАТЬ 2
Вы не будете вызывать Rootstack в index.js.Ваш index.js будет выглядеть примерно так:
класс экспорта по умолчанию Index extends Component {
render() {
const { globalContainer } = styles;
return (
<Root style={ globalContainer }>
<Header navigation={this.props.navigation}/>
</Root>
)
}
}
Если index.js - ваш входной файл, вам придется создать новыйвходной файл, который вызывает RootStack.
Что-то вроде entryFile.js
render() { return <RootStack /> }
, который автоматически отобразит все ваши маршруты и поместит index.js в качестве первого экрана.