在抽屉堆栈之间传递参数 react-navigation
Pass parameters between drawer stacks react-navigation
我的路由器设置如下
import { createAppContainer, createDrawerNavigator, createStackNavigator, createSwitchNavigator } from "react-navigation";
import Home from "./components/Home";
import Search from "./components/Search";
import Map from "./components/Map";
import Login from "./components/Login";
import ForgotPassword from "./components/ForgotPassword";
import SideMenu from "./SideMenu";
const DashboardStack = createStackNavigator(
{
Home: { screen: Home },
Search : {screen : Search}
}
);
const MapStack = createStackNavigator(
{
Map: { screen: Map },
}
);
const AuthStack = createStackNavigator(
{
Login: { screen: Login },
ForgotPassword: { screen: ForgotPassword },
}
);
export const DrawerStack = createDrawerNavigator(
{
Dashboard: { screen: DashboardStack },
Map: { screen: MapStack },
},
{
contentComponent: SideMenu,
drawerWidth: 250
}
);
export const AppNavigator = createStackNavigator(
{
Drawer: { screen: DrawerStack },
Auth: { screen: AuthStack },
},
{
// initialRouteName: "Drawer",
headerMode: 'none',
mode: 'modal',
}
);
export default createAppContainer(DrawerStack);
一切正常,只是一个小问题。当我从主页导航到搜索屏幕,然后切换到带有参数的地图屏幕时,这些参数没有到达地图屏幕。
我当前的设置是 codepan
您的问题是您的 MapStack 和地图屏幕都具有相同的名称,'Map'。
只需将 MapStack 路由替换为 'MapStack' 之类的其他内容,您就会获得参数。
看这里:https://snack.expo.io/SyTFUPZUB
export const DrawerStack = createDrawerNavigator(
{
Dashboard: { screen: DashboardStack },
MapStack: { screen: MapStack },
},
{
contentComponent: SideMenu,
drawerWidth: 250
}
);
@sfratini 是对的
问题确实是 "Map" 密钥出现在两个地方。
因此 navigation.navigate("Map") 将导航到 MapStack。
导航到堆栈意味着转到该堆栈的当前屏幕,默认为 initialRouteName 或堆栈中的第一个屏幕。
要验证这一点,请在 MapStack 中添加另一个屏幕作为第一个屏幕并检查行为。
因此,您的问题的解决方案是按照@sfratini 的建议将 "Map" 键重命名为其他名称。
只需将地图屏幕添加到仪表板堆栈即可正常工作
const DashboardStack = createStackNavigator(
{
Home: { screen: Home },
Search : {screen : Search},
Map: { screen: Map }
}
);
然后使用
this.props.navigation.getParam('name', 'name is coming')
获取名称参数值
您可以在地图屏幕中访问参数,如下所示:
更新这个:
render() {
return (
<SafeAreaView style={styles.container}>
<Text>Map</Text>
</SafeAreaView>
)
}
对此:
render() {
return (
<SafeAreaView style={styles.container}>
<Text>{this.props.navigation.state.params.name}</Text>
</SafeAreaView>
)
}
并且您必须将地图屏幕与主页放在一起,然后按如下方式搜索 Stack:
import { createAppContainer, createDrawerNavigator, createStackNavigator,
createSwitchNavigator } from "react-navigation";
import Home from "./components/Home";
import Search from "./components/Search";
import Map from "./components/Map";
import Login from "./components/Login";
import ForgotPassword from "./components/ForgotPassword";
import SideMenu from "./SideMenu";
const DashboardStack = createStackNavigator(
{
Home: { screen: Home },
Search : {screen : Search},
Map: { screen: Map },
}
);
const AuthStack = createStackNavigator(
{
Login: { screen: Login },
ForgotPassword: { screen: ForgotPassword },
}
);
export const DrawerStack = createDrawerNavigator(
{
Dashboard: { screen: DashboardStack },
},
{
contentComponent: SideMenu,
drawerWidth: 250
}
);
export const AppNavigator = createStackNavigator(
{
Drawer: { screen: DrawerStack },
Auth: { screen: AuthStack },
} ,
{
// initialRouteName: "Drawer",
headerMode: 'none',
//mode: 'modal',
}
);
export default createAppContainer(DrawerStack);
你的蛇的结果:
希望这会有所帮助。
我的路由器设置如下
import { createAppContainer, createDrawerNavigator, createStackNavigator, createSwitchNavigator } from "react-navigation";
import Home from "./components/Home";
import Search from "./components/Search";
import Map from "./components/Map";
import Login from "./components/Login";
import ForgotPassword from "./components/ForgotPassword";
import SideMenu from "./SideMenu";
const DashboardStack = createStackNavigator(
{
Home: { screen: Home },
Search : {screen : Search}
}
);
const MapStack = createStackNavigator(
{
Map: { screen: Map },
}
);
const AuthStack = createStackNavigator(
{
Login: { screen: Login },
ForgotPassword: { screen: ForgotPassword },
}
);
export const DrawerStack = createDrawerNavigator(
{
Dashboard: { screen: DashboardStack },
Map: { screen: MapStack },
},
{
contentComponent: SideMenu,
drawerWidth: 250
}
);
export const AppNavigator = createStackNavigator(
{
Drawer: { screen: DrawerStack },
Auth: { screen: AuthStack },
},
{
// initialRouteName: "Drawer",
headerMode: 'none',
mode: 'modal',
}
);
export default createAppContainer(DrawerStack);
一切正常,只是一个小问题。当我从主页导航到搜索屏幕,然后切换到带有参数的地图屏幕时,这些参数没有到达地图屏幕。
我当前的设置是 codepan
您的问题是您的 MapStack 和地图屏幕都具有相同的名称,'Map'。
只需将 MapStack 路由替换为 'MapStack' 之类的其他内容,您就会获得参数。
看这里:https://snack.expo.io/SyTFUPZUB
export const DrawerStack = createDrawerNavigator(
{
Dashboard: { screen: DashboardStack },
MapStack: { screen: MapStack },
},
{
contentComponent: SideMenu,
drawerWidth: 250
}
);
@sfratini 是对的
问题确实是 "Map" 密钥出现在两个地方。
因此 navigation.navigate("Map") 将导航到 MapStack。 导航到堆栈意味着转到该堆栈的当前屏幕,默认为 initialRouteName 或堆栈中的第一个屏幕。
要验证这一点,请在 MapStack 中添加另一个屏幕作为第一个屏幕并检查行为。
因此,您的问题的解决方案是按照@sfratini 的建议将 "Map" 键重命名为其他名称。
只需将地图屏幕添加到仪表板堆栈即可正常工作
const DashboardStack = createStackNavigator(
{
Home: { screen: Home },
Search : {screen : Search},
Map: { screen: Map }
}
);
然后使用
this.props.navigation.getParam('name', 'name is coming')
获取名称参数值
您可以在地图屏幕中访问参数,如下所示:
更新这个:
render() {
return (
<SafeAreaView style={styles.container}>
<Text>Map</Text>
</SafeAreaView>
)
}
对此:
render() {
return (
<SafeAreaView style={styles.container}>
<Text>{this.props.navigation.state.params.name}</Text>
</SafeAreaView>
)
}
并且您必须将地图屏幕与主页放在一起,然后按如下方式搜索 Stack:
import { createAppContainer, createDrawerNavigator, createStackNavigator,
createSwitchNavigator } from "react-navigation";
import Home from "./components/Home";
import Search from "./components/Search";
import Map from "./components/Map";
import Login from "./components/Login";
import ForgotPassword from "./components/ForgotPassword";
import SideMenu from "./SideMenu";
const DashboardStack = createStackNavigator(
{
Home: { screen: Home },
Search : {screen : Search},
Map: { screen: Map },
}
);
const AuthStack = createStackNavigator(
{
Login: { screen: Login },
ForgotPassword: { screen: ForgotPassword },
}
);
export const DrawerStack = createDrawerNavigator(
{
Dashboard: { screen: DashboardStack },
},
{
contentComponent: SideMenu,
drawerWidth: 250
}
);
export const AppNavigator = createStackNavigator(
{
Drawer: { screen: DrawerStack },
Auth: { screen: AuthStack },
} ,
{
// initialRouteName: "Drawer",
headerMode: 'none',
//mode: 'modal',
}
);
export default createAppContainer(DrawerStack);
你的蛇的结果:
希望这会有所帮助。