Reactjs 反应本机StackNavigator initialRouteName

Reactjs 反应本机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

在React本机导航库“React Navigation”中

如何通过异步存储设置StackNavigator initialRouteName

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 />
}