我有两个组件(列表和详细信息):
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导航到不同的屏幕,然后从那些屏幕导航到另一个屏幕并再次返回到导航的屏幕?
答案 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,
},
});