Reactjs 反应本机StackNavigator initialRouteName
在React本机导航库“React Navigation”中 如何通过异步存储设置StackNavigator initialRouteNameReactjs 反应本机StackNavigator initialRouteName,reactjs,react-native,react-navigation,asyncstorage,Reactjs,React Native,React Navigation,Asyncstorage,在React本机导航库“React Navigation”中 如何通过异步存储设置StackNavigator initialRouteName function getInitialScreen() { AsyncStorage.getItem('initialScreen') .then(screenName => { return (screenName) ? screenName
function getInitialScreen() {
AsyncStorage.getItem('initialScreen')
.then(screenName => {
return (screenName)
? screenName
: 'Login';
})
.catch(err => {});
}
const Navigator = StackNavigator({
Splash: { screen: Splash },
Login: { screen: Login },
WebPage: { screen: WebPage }
}, {
initialRouteName: getInitialScreen()
});
我也遇到过这个问题,目前唯一好的解决方案是以下示例:
const RootNavLogged = StackNavigator({
...
},{
initialRouteName : 'Home'
});
const RootNav = StackNavigator({
...
},{
initialRouteName : 'Login'
});
class App extends Component {
render(){
if (this.props.userLogged == true ){
return (
<RootNavLogged/>
)
} else {
return(
<RootNav/>
)
}
}
}
const RootNavLogged=StackNavigator({
...
},{
initialRouteName:“主页”
});
const RootNav=StackNavigator({
...
},{
initialRouteName:“登录”
});
类应用程序扩展组件{
render(){
if(this.props.userLogged==true){
返回(
)
}否则{
返回(
)
}
}
}
完整解决方案来自:
我的初始屏幕
import React, {Component} from 'react';
import {connect} from 'react-redux';
import * as GeneralPref from './../preferences/GeneralPref'
import Log from './../utils/Log'
import {AsyncStorage, View} from 'react-native';
import * as Pref from './../preferences/Preferences';
import {NavigationActions} from 'react-navigation'
const TAG = 'InitialScreen'
class InitialScreen extends Component {
static navigationOptions = {
header: false
};
componentWillMount() {
Log(TAG+' Mount')
const {navigate} = this.props.navigation;
GeneralPref
.getInitialScreen()
.then(value => {
Log(TAG+' Initial',value)
if (value != null) {
Log(TAG+' Initial',value)
return value
} else {
Log(TAG+' No Initial','Splash')
return 'Splash'
}
})
.then(screenName => this.props.navigation.dispatch(NavigationActions.reset({
index: 0,
actions: [NavigationActions.navigate({routeName: screenName})]
})))
.catch(err => {
Log(TAG+' Initial Error',value)
this.props.navigation.dispatch(NavigationActions.reset({
index: 0,
actions: [NavigationActions.navigate({routeName: 'Splash'})]
}))
});
}
render() {
return null;
}
}
export default InitialScreen;
然后在语言屏幕上
changeLanguageTo(language) {
Log(TAG+'Change Language', "Change Language To: " + language.code);
// Log(TAG, 'Current State');
Log(TAG+' Language State', language);
GeneralPref.setInitialScreen('Login');
this
.props
.actions
.changeLanguage(language);
I18nManager.forceRTL(true);
// Immediately reload the React Native Bundle
RNRestart.Restart();
};
根据您的要求,使用多个路由更改InitialRouteName。我让它这样工作 创建
路由器
文件导入所有屏幕
导出无状态函数调用它createRootNavigator
,参数为(load=”“)
在componentDidMount()
方法中相应地设置状态。最后呈现新的布局
render() {
const Layout = createRootNavigator(this.state.load);
<Layout />
}
render(){
const Layout=createRootNavigator(this.state.load);
}
上述方法对我很有效。希望它能帮助某些人。它应该是灵活的,我会在他们的回购协议上开一个问题
export const createRootNavigator = (load="<Your Initial Screen>") => {
return stackNavigator({
Initialize: {
screen: Initialize,
},
Main: {
screen: Main,
},
{
initialRouteName: load
}
})
}
state = {
load: "<Your Initial Screen>"
}
state = {
load: "Initialize" // value is string
}
render() {
const Layout = createRootNavigator(this.state.load);
<Layout />
}