#javascript #react-native
#javascript #react-native
Вопрос:
Я хочу знать один простой способ переключения с одного экрана на другой. Потому что я действительно расстраиваюсь из-за этой проблемы. Я объявил один навигатор стека на своем рабочем столе, чтобы инициализировать запуск экрана. Вот код для этого-
HomeScreen.js
import React from 'react';
import { StyleSheet, Text, View, AsyncStorage } from 'react-native';
import {StackNavigator} from 'react-navigation';
import WelcomeScreen from './WelcomeScreen';
import LoginScreen from './components/LoginScreen';
import NoteMeHome from './components/NoteMeHome';
import HomeDrawer from './HomeDrawer/HomeDrawer';
import SettingsScreen from './components/SettingsScreen';
import TestScreen from './components/TestScreen';
class HomeScreen extends React.Component {
state = {
getValue: null,
}
async componentDidMount() {
const token = await AsyncStorage.getItem('toke');
this.setState({ getValue: token });
}
render() {
console.log('#ZZZ:', this.state.getValue);
if(this.state.getValue !== null) {
return (
<AppStackNavigator/>
);
} else {
return (
<AppStackNavigator2/>
);
}
}
}
const AppStackNavigator = new StackNavigator({
HomeDrawer: {screen:HomeDrawer},
WelcomeScreen: {screen:WelcomeScreen},
LoginScreen: {screen:LoginScreen},
NoteMeHome: {screen:NoteMeHome},
SettingsScreen: {screen:SettingsScreen},
TestScreen: {screen:TestScreen}
})
const AppStackNavigator2 = new StackNavigator({
LoginScreen: {screen:LoginScreen},
WelcomeScreen: {screen:WelcomeScreen},
HomeDrawer: {screen:HomeDrawer
},
NoteMeHome: {screen:NoteMeHome},
SettingsScreen: {screen:SettingsScreen},
TestScreen: {screen:TestScreen}
})
export default HomeScreen;
После входа в систему для следующего экрана я создал один класс с навигацией по ящику с именем HomeDrawer. Вот код для этого-
HomeDrawer.js
import React, {Component} from "react";
import {View, Text, StyleSheet, ScrollView, Image, AsyncStorage, ImageBackground} from 'react-native';
import {Container, Content, Icon, Header, Body} from 'native-base';
import {DrawerNavigator, StackNavigator, DrawerItems, SafeAreaView} from 'react-navigation';
import NoteMeHome from '../components/NoteMeHome';
import SettingsScreen from '../components/SettingsScreen';
import {Root} from 'native-base';
import {Font, AppLoading} from 'expo';
import WelcomeScreen from "../WelcomeScreen";
let user_email ='', user_first_name='';
class HomeDrawer extends Component {
state = {
loading: true
}
static navigationOptions = {
headerLeft: null
}
componentDidMount() {
AsyncStorage.getItem("user_email").then(value => {
console.log(value);
// you will need to handle case when `@ProductTour:key` is not exists
user_email = value;
});
AsyncStorage.getItem("user_first_name").then(value => {
console.log(value);
// you will need to handle case when `@ProductTour:key` is not exists
user_first_name = value;
});
}
async componentWillMount() {
await Font.loadAsync ({
Roboto: require('native-base/Fonts/Roboto.ttf'),
Roboto_medium: require('native-base/Fonts/Roboto_medium.ttf')
});
this.setState({loading:false});
}
render() {
if(this.state.loading) {
return(
<Root>
<AppLoading/>
</Root>
)
}
return(
<MyApp/>
)
}
}
const CustomDrawerContentComponent = (props) => (
<View style={{backgroundColor:"#ffff", height:'100%'}}>
<ImageBackground source={require('../assets/header.jpeg')} style={{width: '100%', height: 150, resizeMode:'cover', backgroundColor:"@aaaa"}}>
<Body style={styles.drawerBody}>
<Image
style={styles.drawerImage}
source={{uri: 'https://img.icons8.com/ultraviolet/80/000000/administrator-male.png'}}
/>
<View style={styles.drawerHeaderText}>
<Text style={{color:'#ffffff', fontSize:20, fontWeight:'400'}}>{user_email}</Text>
<Text style={{color:'#ffffff', fontSize:16, fontWeight:'200'}}>{user_first_name}</Text>
</View>
</Body>
</ImageBackground>
<Content style={{marginTop:30 }}>
<DrawerItems {...props}/>
</Content>
</View>
);
const MyApp = DrawerNavigator({
NoteMeHome:{
screen: NoteMeHome
},
Settings:{
screen: SettingsScreen
},
WelcomeScreen : {
screen: WelcomeScreen
}
},
{
initialRouteName: 'NoteMeHome',
drawerPosition: 'left',
contentComponent: CustomDrawerContentComponent,
drawerOpenRoute: 'DrawerOpen',
drawerCloseRoute: 'DrawerClose',
drawerToggleRoute: 'DrawerToggle'
}
);
export default HomeDrawer;
Я создал SettingsScreen.js для навигатора ящика. Вот код для этого-
SettingsScreen.js
import React,{Component} from 'react';
import {View, Text, StyleSheet, Image, TouchableHighlight} from 'react-native';
import {Container, Content, Icon, Button} from 'native-base';
import CustomHeader from './CustomHeader';
class SettingsScreen extends Component {
static navigationOptions = ({navigation}) => ({
title: "Settings",
headerLeft: <Icon name="ios-menu" style={{paddingLeft:10}}
onPress={()=>navigation.navigate('DrawerOpen')}/>,
drawerIcon:
<Image source={{uri: 'https://img.icons8.com/ultraviolet/40/000000/automatic.png'}}
style={styles.icon}
/>
})
render() {
return(
<Container>
<CustomHeader
title="Settings"
drawerOpen={()=>this.props.navigation.navigate('DrawerOpen')}
/>
<Content contentContainerStyle={{flex:1, alignItems:'center',
justifyContent:'center', padding:10}}>
<Button full onPress={() => this.props.navigation.navigate('TestScreen')}>
<Text style={{color:'white'}}>Go To Test Screen</Text>
</Button>
</Content>
</Container>
)
}
}
export default SettingsScreen;
Теперь проблема в том, что-
Вы можете увидеть в моем SettingsScreen.js файл, я добавил эту строку при нажатии кнопки-
this.props.navigation.navigate('TestScreen')
Который должен запускать класс TestScreen, который находится за пределами навигации ящика. Вот код для этого-
TestScreen.js
import React,{Component} from 'react';
import {View, Text, StyleSheet, Image, TouchableHighlight} from 'react-native';
class TestScreen extends Component {
render() {
return(
<View>
<Text>Hello from Test Screen</Text>
</View>
)
}
}
export default TestScreen;
Но после нажатия кнопки в SettingsScreen.js класс ничего не работает. Я могу перейти к другому классу внутри HomeDrawer, изменив код при нажатии. Но в случае любого другого класса, который находится за пределами навигации по ящику, он не работает.
Версия, которую я использовал для react-navigation, является-
react-navigation@1.0.0-beta.23
Я не хочу обновлять эту версию, потому что в последней версии мой код показывал некоторые другие ошибки. Итак, пожалуйста, ответьте на вопрос, может ли кто-нибудь помочь мне с текущей конфигурацией кода.
Ответ №1:
Обновление пожалуйста, обновите react-navigation, используя npm -i react-navigation@latest
а также вам необходимо перейти по ссылке ниже, прежде чем использовать код. после обновления нам нужно позаботиться о стольких вещах.
ссылка:https://reactnavigation.org/blog/2018/11/17/react-navigation-3.0.html
Оригинальный ответ
Вы можете использовать switch navigator для своих целей.
сначала вы должны создать класс навигации,
например:
import {
createAppContainer,
createStackNavigator,
createDrawerNavigator,
createSwitchNavigator
} from "react-navigation";
...
...
...
const AppStackNavigator = createStackNavigator({
HomeDrawer: {screen:HomeDrawer},
WelcomeScreen: {screen:WelcomeScreen},
LoginScreen: {screen:LoginScreen},
NoteMeHome: {screen:NoteMeHome},
SettingsScreen: {screen:SettingsScreen},
TestScreen: {screen:TestScreen}
})
const AppStackNavigator2 = createStackNavigator({
LoginScreen: {screen:LoginScreen},
WelcomeScreen: {screen:WelcomeScreen},
HomeDrawer: {screen:HomeDrawer},
NoteMeHome: {screen:NoteMeHome},
SettingsScreen: {screen:SettingsScreen},
TestScreen: {screen:TestScreen}
})
const DrawerNavi = createDrawerNavigator({
NoteMeHome:{ screen: NoteMeHome},
Settings:{ screen: SettingsScreen},
WelcomeScreen : { screen: WelcomeScreen}
},
{
initialRouteName: 'NoteMeHome',
drawerPosition: 'left',
contentComponent: CustomDrawerContentComponent,
drawerOpenRoute: 'DrawerOpen',
drawerCloseRoute: 'DrawerClose',
drawerToggleRoute: 'DrawerToggle'
}
);
const switchNavigator = createSwitchNavigator(
{
AppStackNavigator: AppStackNavigator,
AppStackNavigator2: AppStackNavigator2,
DrawerNavi: DrawerNavi
},
{ headerMode: "none", initialRouteName: "AppStackNavigator" }
);
const App = createAppContainer(switchNavigator);
export default App;
Затем вы можете переключать эти навигации с помощью,
this.props.navigation.navigate("AppStackNavigator2");
Комментарии:
1. Ну, я сделал то, что вы упомянули. Сначала я создал класс SwitchNavigation и вставил весь ваш код в этот класс. После этого я импортирую приложение в свой SettingsScreen.js файл. После запуска проекта отображается следующая ошибка — undefined не является функцией (рядом с ‘… (0, _reactNavigation.createStackNavigator)…’)
2. Вы импортировали все файлы из «react-navigation» вверху?
3. Вы импортировали свои классы в файл, т.Е.. ‘LoginScreen’, ‘WelcomeScreen’, .. etc?
4. Да, я сделал. Здесь вы можете это проверить — [ссылка] codeshare.io/5ogMgg
5. Сначала вы должны обновить свою react-navigation до версии 3.6.1. Функции, которые я использовал для реализации необходимой логики, в последней версии. Пожалуйста, попробуйте и дайте мне знать.