从堆栈导航器中删除屏幕
Remove screen from stack navigator
我观察到后退按钮逻辑在查看堆栈中的屏幕顺序时起作用。我在堆栈导航器中放置了一个抽屉导航器。
在堆栈顶部我有启动画面。在仪表板上,当我按下后退按钮时,它会带我进入启动画面。
如何在进入应用程序后从堆栈中删除启动画面,因此当我按下后退按钮仪表板时,它将退出应用程序而不是进入启动画面。
/* @flow */
import React from "react";
import { Platform, Text } from "react-native";
import { Root } from "native-base";
import { StackNavigator, DrawerNavigator} from "react-navigation";
import Register from "./components/Register";
import Available from "./components/Available";
import Splash from "./components/splash/“;
import SideBar from "./components/sidebar";
import Discover from "./components/Discover/";
import Dashboard from "./components/Dashboard/";
import Contact from "./components/Contact"
const Drawer = DrawerNavigator(
{
Dashboard: { screen: Dashboard },
Discover: { screen: Discover },
Contact: { screen: Contact},
},
{
navigationOptions: {
gesturesEnabled: false,
},
initialRouteName: "Dashboard",
contentOptions: {
activeTintColor: "#e91e63"
},
drawerPosition: 'right',
contentComponent: props => <SideBar {...props} />
}
);
const AppNavigator = StackNavigator(
{
Splash: { screen: Splash },
Drawer: { screen: Drawer },
Available: { screen: Available },
Register: { screen: Register },
},
{
// initialRouteName: “Splash”,
headerMode: "none",
}
);
export default () =>
<Root>
<AppNavigator />
</Root>;
一种解决方案是重置启动画面组件内的堆栈并将用户重定向到您喜欢的屏幕:
import { NavigationActions } from 'react-navigation'
const resetAction = NavigationActions.reset({
index: 0,
actions: [
NavigationActions.navigate({ routeName: 'Drawer'})
]
})
this.props.navigation.dispatch(resetAction)
对于 react-navigation
的较新版本:
import { StackActions, NavigationActions } from 'react-navigation';
const resetAction = StackActions.reset({
index: 0,
actions: [NavigationActions.navigate({ routeName: 'Profile' })],
});
this.props.navigation.dispatch(resetAction);
我用 this
解决了
代码:
const prevGetStateForActionHomeStack = HomeStack.router.getStateForAction;
HomeStack.router = {
...HomeStack.router,
getStateForAction(action, state) {
if (state && action.type === 'ReplaceCurrentScreen') {
const routes = state.routes.slice(0, state.routes.length - 1);
routes.push(action);
return {
...state,
routes,
index: routes.length - 1,
};
}
return prevGetStateForActionHomeStack(action, state);
},
};
replaceScreen = () => {
const { locations, position } = this.props.navigation.state.params;
this.props.navigation.dispatch({
key: 'NearMeMap',
type: 'ReplaceCurrentScreen',
routeName: 'NearMeMap',
params: { locations, position },
});
};
此外,如果您需要深入解释代码,请观看此短片 here
useEffect(() => {
setTimeout(() => {
navigation.reset({
index:0,
routes:[
{
name:"Welcome",
// params:{key:'param'},
},
],
});
}, 1000);},[]);
您还可以像这样触发 onPress:
onPress={()=>navigation.reset({
index:0,
routes:[
{
name:"NameOfScreen",
// params:{key:'param'},
},
],
})}
在 react-navigation 5.x 版本中。如果你想打开新屏幕并删除之前的堆栈屏幕,你可以这样写:-
navigation.dispatch(StackActions.replace('screen_name', {params: {}}));
replace 操作允许替换导航状态下的路线。您可以将其导入为:-
import { StackActions } from '@react-navigation/native';
如果您想对堆栈导航执行其他操作,请查看此 link-
https://reactnavigation.org/docs/stack-actions
最简单的解决方案之一是,用新屏幕替换当前屏幕,这样用户就不能返回。
const SplashScreen: () => {
...
navigation.replace("LoginScreen"); // Move forward and Remove this screen from stack
我观察到后退按钮逻辑在查看堆栈中的屏幕顺序时起作用。我在堆栈导航器中放置了一个抽屉导航器。
在堆栈顶部我有启动画面。在仪表板上,当我按下后退按钮时,它会带我进入启动画面。
如何在进入应用程序后从堆栈中删除启动画面,因此当我按下后退按钮仪表板时,它将退出应用程序而不是进入启动画面。
/* @flow */
import React from "react";
import { Platform, Text } from "react-native";
import { Root } from "native-base";
import { StackNavigator, DrawerNavigator} from "react-navigation";
import Register from "./components/Register";
import Available from "./components/Available";
import Splash from "./components/splash/“;
import SideBar from "./components/sidebar";
import Discover from "./components/Discover/";
import Dashboard from "./components/Dashboard/";
import Contact from "./components/Contact"
const Drawer = DrawerNavigator(
{
Dashboard: { screen: Dashboard },
Discover: { screen: Discover },
Contact: { screen: Contact},
},
{
navigationOptions: {
gesturesEnabled: false,
},
initialRouteName: "Dashboard",
contentOptions: {
activeTintColor: "#e91e63"
},
drawerPosition: 'right',
contentComponent: props => <SideBar {...props} />
}
);
const AppNavigator = StackNavigator(
{
Splash: { screen: Splash },
Drawer: { screen: Drawer },
Available: { screen: Available },
Register: { screen: Register },
},
{
// initialRouteName: “Splash”,
headerMode: "none",
}
);
export default () =>
<Root>
<AppNavigator />
</Root>;
一种解决方案是重置启动画面组件内的堆栈并将用户重定向到您喜欢的屏幕:
import { NavigationActions } from 'react-navigation'
const resetAction = NavigationActions.reset({
index: 0,
actions: [
NavigationActions.navigate({ routeName: 'Drawer'})
]
})
this.props.navigation.dispatch(resetAction)
对于 react-navigation
的较新版本:
import { StackActions, NavigationActions } from 'react-navigation';
const resetAction = StackActions.reset({
index: 0,
actions: [NavigationActions.navigate({ routeName: 'Profile' })],
});
this.props.navigation.dispatch(resetAction);
我用 this
解决了代码:
const prevGetStateForActionHomeStack = HomeStack.router.getStateForAction;
HomeStack.router = {
...HomeStack.router,
getStateForAction(action, state) {
if (state && action.type === 'ReplaceCurrentScreen') {
const routes = state.routes.slice(0, state.routes.length - 1);
routes.push(action);
return {
...state,
routes,
index: routes.length - 1,
};
}
return prevGetStateForActionHomeStack(action, state);
},
};
replaceScreen = () => {
const { locations, position } = this.props.navigation.state.params;
this.props.navigation.dispatch({
key: 'NearMeMap',
type: 'ReplaceCurrentScreen',
routeName: 'NearMeMap',
params: { locations, position },
});
};
此外,如果您需要深入解释代码,请观看此短片 here
useEffect(() => {
setTimeout(() => {
navigation.reset({
index:0,
routes:[
{
name:"Welcome",
// params:{key:'param'},
},
],
});
}, 1000);},[]);
您还可以像这样触发 onPress:
onPress={()=>navigation.reset({
index:0,
routes:[
{
name:"NameOfScreen",
// params:{key:'param'},
},
],
})}
在 react-navigation 5.x 版本中。如果你想打开新屏幕并删除之前的堆栈屏幕,你可以这样写:-
navigation.dispatch(StackActions.replace('screen_name', {params: {}}));
replace 操作允许替换导航状态下的路线。您可以将其导入为:-
import { StackActions } from '@react-navigation/native';
如果您想对堆栈导航执行其他操作,请查看此 link- https://reactnavigation.org/docs/stack-actions
最简单的解决方案之一是,用新屏幕替换当前屏幕,这样用户就不能返回。
const SplashScreen: () => {
...
navigation.replace("LoginScreen"); // Move forward and Remove this screen from stack