使用react-navigation的SwitchNavigator,session过期后重新登录无法跳转

使用react-navigation的SwitchNavigator,包括登录页面和一个抽屉导航,session过期后使用this.props.navigation.navigate('login')跳转至登录页面重新登录,登录成功但没有跳转。

import React, { Component } from 'react';
import {
    AppRegistry,
    Text,
    View,
    Button,
    StyleSheet,
    Image,
} from 'react-native';
import { createDrawerNavigator,SwitchNavigator } from 'react-navigation';

import { CurrentTaskRoot } from '../page/currentTask/CurrentTaskRoot';
import { ApplyRoot } from '../page/apply/ApplyRoot';
import { ApprovalRoot } from '../page/approval/ApprovalRoot';
import { TaskSchedulingRoot } from '../page/taskScheduling/TaskSchedulingRoot';
import { RefuelRecordRoot } from '../page/refuelRecord/RefuelRecordRoot';
import { HandoverCarRoot } from '../page/handoverCar/HandoverCarRoot';
import { AddressBookRoot } from '../page/addressBook/AddressBookRoot';
import { SettingRoot } from '../page/setting/SettingRoot';
import Login from '../page/Login';

const DrawerNav = createDrawerNavigator({
    CurrentTaskRoot: {
        screen: CurrentTaskRoot,
        navigationOptions: {
            drawerLabel: '当前任务'
        }
    },
    ApplyRoot: {
        screen: ApplyRoot,
        navigationOptions: {
            drawerLabel: '我的申请'
        }
    },
    ApprovalRoot: {
        screen: ApprovalRoot,
         navigationOptions: {
             drawerLabel: '我的审核'
         }
    },
    TaskSchedulingRoot: {
        screen: TaskSchedulingRoot,
        navigationOptions: {
            drawerLabel: '任务调度'
        }
    },
    RefuelRecordRoot: {
        screen: RefuelRecordRoot,
        navigationOptions: {
            drawerLabel: '加油记录'
        }
    },
    HandoverCarRoot: {
        screen: HandoverCarRoot,
        navigationOptions: {
            drawerLabel: '交接车'
        }
    },
    AddressBookRoot: {
        screen: AddressBookRoot,
        navigationOptions: {
            drawerLabel: '通讯录'
        }
    },
    SettingRoot: {
        screen: SettingRoot,
        navigationOptions: {
            drawerLabel: '设置'
        }
    }
}, {
    drawerWidth: 150, // 抽屉宽
    drawerPosition: 'left', // 抽屉在左边还是右边
    initialRouteName: 'HandoverCarRoot', // 默认页面组件
    contentOptions: {
        activeTintColor: '#028ce5',  // 选中文字颜色
        activeBackgroundColor: '#fff', // 选中背景颜色
        inactiveTintColor: '#000',  // 未选中文字颜色
        inactiveBackgroundColor: '#fff', // 未选中背景颜色
    }
});

export const Navigator = SwitchNavigator({
    Login: Login,
    Draw: DrawerNav
},
{
    initialRouteName: 'Login',
});
//获取所有加油记录
    getList(){
        if(this.state.recordCount > 0) {
            this.setState({
                "type": 2
            })
        }
        let fd = new FormData();
        fd.append('session',this.state.session);
        fd.append('carId',this.state.carId);
        fd.append('type',this.state.type.toString());
        fd.append('updateTime',this.state.updateTime.toString());
        fd.append('recordCount',this.state.recordCount);
        HttpUtil.post('/carManage/phone/carOils/findAllCarOils',fd)
            .then(result=>{
                if(result.code == 1) {
                    let d = JSON.parse(result.content);
                    if(d.length>0) {
                        this.setState({
                            data: d,
                            recordCount : this.state.recordCount+d.length,
                            isRefresh: false,
                            showFoot:0
                        })
                    }else{
                        this.setState({
                            isRefresh:false,
                            showFoot:1
                        })
                    }
                }else if(result.code == 2) {
                    this.setState({isRefresh:false,showFoot:0});
                    Alert.alert('提示',result.content)
                }else if(result.code == 3) {
                    this.setState({isRefresh:false,showFoot:0});
                    Alert.alert('提示',result.content);
                    this.props.navigation.navigate('Login');//session过期重新登录
                } else {
                    this.setState({isRefresh:false,showFoot:0})
                    Alert.alert('提示',result.content)
                }
            })
    }
HttpUtil.post('/carManage/phone/login/checkLogin',fd)
            // .then(()=>Toast.loading('Loading...',0))
            .then(result=>{
                if(result.code == 1){
                    Toast.success('登录成功!', 1);
                    let d = JSON.parse(result.content);
                    storage.save({
                        key: 'session',
                        data: d.session
                    });
                    storage.save({
                        key: 'userName',
                        data: this.state.userName
                    });
                    storage.save({
                        key: 'imgUrl',
                        data: {
                            meetImage:d.meetImage,
                            returnImage:d.returnImage,
                            oilsImage:d.oilsImage,
                            applyCarImage:d.applyCarImage
                        }
                    });

                    this.props.navigation.navigate('Draw');
                       
                }else if(result.code == 2){
                    Toast.info(result.content,2);
                }else if(result.code == 3){
                    Toast.fail(result.content,2);
                }else if(result.code == 4){
                    Toast.fail(result.content,2);
                }
            })
            .catch(error=>{
                this.setState({
                    result: JSON.stringify(error)
                })
            })
阅读 3k
1 个回答

路由如下:
export const Navigator = SwitchNavigator({

Login: Login,
Draw: DrawerNav

},
{

initialRouteName: 'Login',

});
登录验证成功的跳转:this.props.navigation.navigate('Draw');
令牌过期的跳转:this.props.navigation.navigate('Login');
这个跳转本身是没有问题的,之所以跳转失败原因可能是由于在其他子路由里也创建了一个Login的路由,导致堆栈中的Login被替换。

推荐问题