如何导航到不同的屏幕并从使用 DrawerNavigator 导航的屏幕返回屏幕?
How to navigate to different screen and get back to the screen from where its navigated using DrawerNavigator?
我有两个组件(列表和详细信息):
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),它们基本上是同一类型的列表,所以我为这两个屏幕使用相同的列表组件。从这些屏幕中的每一个,我都想导航到项目的详细信息,在这种情况下,它也具有相同类型的布局,因此我对两个列表项都使用了详细信息组件。
最后,当应用程序启动时,我希望显示 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 路线时。 Detail 路由中有一个后退按钮,按下该按钮可导航回 NowList。
但是,当我转到“很快”路线并导航到“详细路线”时,我会转到“详细信息”屏幕。但是,当我在详细导航 header 上按后退按钮时,我没有导航回 SoonList 屏幕,而是导航到 NowList 屏幕。
我想我在这里遗漏了一些东西,或者我的路线布局不是它应该的样子。你能帮我如何配置路由,以便我可以使用 DrawerNavigator 导航到不同的屏幕,然后从这些屏幕导航到另一个屏幕,然后再返回到导航的屏幕吗?
您的路线布局未在 SoonStack
导航器中指定 Detail
屏幕。当您导航到 Detail
时,react-navigation 导航到唯一以这种方式命名的屏幕。由于它在 NowStack
中,因此返回 returns 到堆栈中的第一个屏幕。
要解决此问题,您可以将另一个 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
成为第一个屏幕。如果打开了Details,那么它就是堆栈中的第二个,back总是回到正确的屏幕。
您可以制作一个包含抽屉导航器和详细信息的堆栈导航器,这样您就可以从抽屉中访问现在列表和即将列出的列表,并能够从这两个列表导航到详细信息屏幕。
const App = StackNavigator({
Drawer: {
screen: Drawer,
},
Detail: {
screen: Detail,
navigationOptions: {
title: 'Detail',
},
},
});
const Drawer = DrawerNavigator({
NowList: {
screen: List,
},
SoonList: {
screen: List,
},
});
我有两个组件(列表和详细信息):
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),它们基本上是同一类型的列表,所以我为这两个屏幕使用相同的列表组件。从这些屏幕中的每一个,我都想导航到项目的详细信息,在这种情况下,它也具有相同类型的布局,因此我对两个列表项都使用了详细信息组件。
最后,当应用程序启动时,我希望显示 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 路线时。 Detail 路由中有一个后退按钮,按下该按钮可导航回 NowList。
但是,当我转到“很快”路线并导航到“详细路线”时,我会转到“详细信息”屏幕。但是,当我在详细导航 header 上按后退按钮时,我没有导航回 SoonList 屏幕,而是导航到 NowList 屏幕。
我想我在这里遗漏了一些东西,或者我的路线布局不是它应该的样子。你能帮我如何配置路由,以便我可以使用 DrawerNavigator 导航到不同的屏幕,然后从这些屏幕导航到另一个屏幕,然后再返回到导航的屏幕吗?
您的路线布局未在 SoonStack
导航器中指定 Detail
屏幕。当您导航到 Detail
时,react-navigation 导航到唯一以这种方式命名的屏幕。由于它在 NowStack
中,因此返回 returns 到堆栈中的第一个屏幕。
要解决此问题,您可以将另一个 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
成为第一个屏幕。如果打开了Details,那么它就是堆栈中的第二个,back总是回到正确的屏幕。
您可以制作一个包含抽屉导航器和详细信息的堆栈导航器,这样您就可以从抽屉中访问现在列表和即将列出的列表,并能够从这两个列表导航到详细信息屏幕。
const App = StackNavigator({
Drawer: {
screen: Drawer,
},
Detail: {
screen: Detail,
navigationOptions: {
title: 'Detail',
},
},
});
const Drawer = DrawerNavigator({
NowList: {
screen: List,
},
SoonList: {
screen: List,
},
});