如何导航到不同的屏幕并返回到使用DrawerNavigator导航的屏幕?

时间:2017-08-18 08:53:07

标签: react-native react-navigation

我有两个组件(列表和详细信息):

List.js:

export default class List extends React.Component {
    render() {
        const {navigate} = this.props.navigation;
        return (
            <View style={styles.container}>
                <Text style={styles.headerText}>List of Contents</Text>
                <Button onPress={()=> navigate('Detail')} title="Go to details"/>
            </View>
        )
    }
}

Detail.js:

export default class Detail extends React.Component {
    render() {
        return (
            <View>
                <Text style={styles.headerText}>Details of the content</Text>
            </View>
        )
    }
}

我想有两个屏幕(NowList和SoonList)基本上是相同类型的列表,所以我在屏幕上使用相同的List组件。从这些屏幕中的每个屏幕,我想导航到项目的详细信息,在这种情况下也具有相同类型的布局,因此我对列表项使用了Detail组件。

最后,当应用程序启动时,我希望显示NowList屏幕。使用抽屉我想导航到SoonList屏幕。

我不确定如何配置此路线。但是,这就是我现在配置路线的方式:

const NowStack = StackNavigator({
    NowList: {
        screen: List,
        navigationOptions: {
            title: 'Now',
        }
    },
    Detail: {
        screen: Detail,
        navigationOptions: {
            title: 'Detail',
        }
    }
});

const SoonStack = StackNavigator({
    SoonList: {
        screen: List,
        navigationOptions: {
            title: 'Soon',
        }
    }
});

export const Drawer = DrawerNavigator({
    Now: {
        screen: NowStack,
    },
    Soon: {
        screen: SoonStack,
    }
});

当我从NowList路线导航到Detail路线时。细节路线中有一个后退按钮,按下后按钮导航回NowList。

然而,当我去很快的路线,并导航到细节路线时,我进入细节屏幕。但是,当我按下详细信息导航标题上的后退按钮,而不是导航回SoonList屏幕时,我将导航到NowList屏幕。

我想我在这里遗漏了一些东西,或者我的路线布局不是它的假设。你能帮助我如何配置路线,以便我可以使用DrawerNavigator导航到不同的屏幕,然后从那些屏幕导航到另一个屏幕并再次返回到导航的屏幕?

2 个答案:

答案 0 :(得分:1)

您的路线布局未在Detail导航器中指定SoonStack屏幕。当您导航到Detail时,react-navigation导航到以这种方式命名的唯一屏幕。因为它在NowStack中,所以返回到堆栈中的第一个屏幕。

要解决此问题,您可以向Detail导航器添加另一个SoonStack屏幕,但是您想要以不同方式命名,或者导航到每个Detail屏幕它的关键。

为了能够导航到正确的Detail屏幕,您可以为每个堆栈导航器添加一个参数。

例如:

const SoonStack = StackNavigator({
    SoonList: {
        screen: List,
        navigationOptions: {
            title: 'Soon',
        }
    },
    SoonDetail: {
        screen: Detail,
        navigationOptions: {
            title: 'Detail',
        }
    }
},{
    initialRouteParams: {
        detailScreen: 'SoonDetail'
    }
});

然后,您可以使用该参数导航到正确的屏幕。

此外,它可以只使用一个StackNavigator,其中包含三个不同的屏幕,并且当使用抽屉切换时,reset堆栈到正确的屏幕。

您可以详细了解reset here

如何使用重置

如果你有一个堆栈导航器:

const TheStack = StackNavigator({
    NowList: { screen: List, ... },
    SoonList: { screen: List, ... },
    Detail: {screen: Details, ... }
});

然后抽屉可以将堆栈状态重置为您想要的任何内容。例如,如果第一个屏幕是NowList并且在抽屉中点击了SoonList,则可以致电:

const action = NavigationActions.reset({
    index: 0,
    actions: [
        NavigationActions.navigate({routeName: 'SoonList'});
    ]
});
this.props.navigation.dispatch(resetAction);

这会导致堆栈重置并将SoonList作为第一个屏幕。如果打开详细信息,那么它是堆栈中的第二个,后退将始终返回到正确的屏幕。

答案 1 :(得分:1)

您可以创建一个包含抽屉导航器和详细信息的堆栈导航器,这样您就可以从抽屉中同时访问现在列表和很快列表,并且可以从两个列表导航到详细信息屏幕。

const App = StackNavigator({
  Drawer: {
    screen: Drawer,
  },
  Detail: {
    screen: Detail,
    navigationOptions: {
      title: 'Detail',
    },
  },
});

const Drawer = DrawerNavigator({
  NowList: {
    screen: List,
  },
  SoonList: {
    screen: List,
  },
});