在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()
});

推荐答案

React Native Navigation on Restart的完整解决方案:

const Navigator = StackNavigator({
    InitialScreen: {
        screen: InitialScreen
    },
    Splash: {
        screen: Splash
    },
    LanguageStartup: {
        screen: LanguageStartup
    },
    Login: {
        screen: Login
    },
    Register: {
        screen: Register
    }
}, {initialRouteName: 'InitialScreen'});

export default Navigator;

我的初始屏幕

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();
  };

React-native相关问答推荐

如何停止在Expo路由中将新文件显示为菜单列表?

AWS Amplify处理后端错误

未执行迁移?

每当我在 React Native Tab Navigator 中切换标签时触发 UseEffect

有人可以帮我实现 Font.loadAsync

如何在 React / React Native 中使用 Emscripten 编译的 JavaScript

No component found for view with name "ARTShape"

React Native 在升级到 0.56 版本后崩溃

如何在 React Native For Android 中删除启动画面后的白屏

eslint Parsing error: Unexpected token =

如何从 React Native 应用程序打开 Google Play store ?

在 Docker 中使用 Fastlane 构建 iOS 应用

react-native 自动完成文本输入

如果我有 AngularJS 基础知识,怎么学习Thinking in ReactJS呢?

React Native 从导航堆栈中清除上一个屏幕

React Native:使用百分比时将视图的宽度设置为等于其高度

React-Native 元素卡在 :app:installDebug

Android Log

JSON 解析错误:无法识别的令牌'<'

如何在 React Native 中强制禁用 iOS 暗模式