ios - 在登录和注册堆栈上禁用抽屉导航向右滑动,但在 React Native Navigation 5.x 中的其他堆栈上禁用
问题描述
我正在尝试在登录/注册堆栈之后的选项卡屏幕上实现嵌套抽屉导航。我遇到的一个问题是抽屉可以从登录/注册中访问,而不仅仅是在选项卡导航上。
这是我的导航代码:
import * as React from 'react';
import { NavigationContainer } from '@react-navigation/native';
import Login from '../screens/Login.js'
import Signup from '../screens/Signup.js'
import { createStackNavigator } from '@react-navigation/stack';
import { createBottomTabNavigator } from '@react-navigation/bottom-tabs';
import { TouchableOpacity } from 'react-native-gesture-handler';
import CameraScreen from '../screens/Camera.js'
import {Ionicons, EvilIcons} from '@expo/vector-icons'
import Home from '../screens/Home.js';
import LivingRoom from '../screens/LivingRoom.js'
import Activity from '../screens/Activity.js'
import Post from '../screens/Post.js'
import Profile from '../screens/Profile.js'
import CommentScreen from '../screens/Comment.js'
import { MaterialIcons } from '@expo/vector-icons';
import { createDrawerNavigator, DrawerContentScrollView, DrawerItemList, DrawerItem } from '@react-navigation/drawer';
import { useDispatch, useSelector } from "react-redux";
import { StyleSheet, Text, View, ImageBackground, Image } from 'react-native';
const Drawer = createDrawerNavigator();
const Stack = createStackNavigator();
const Tab = createBottomTabNavigator();
const styles = StyleSheet.create({
container: {
flex: 1
},
profile: {
marginTop: 100,
width: 80,
height: 80,
borderRadius: 40,
borderWidth: 3,
borderColor: "#fff"
},
name: {
color: "#000",
fontSize: 20,
fontWeight: "800",
marginVertical: 8
},
});
const navigationRef = React.createRef();
function navigate(name, params) {
navigationRef.current && navigationRef.current.navigate(name, params);
}
function TabNavigator() {
return (
<Tab.Navigator
screenOptions={({ route }) => ({
tabBarIcon: ({ color, size, focused }) => {
if(route.name === "Home"){
return <Ionicons name="ios-home" size={28} />
}
if(route.name === "Post"){
return <Ionicons name="ios-add-circle"
size={32}
color="#FF6E65"
style={{
shadowColor: "#E9446A",
shadowOffset: { width: 0, height: 10 },
shadowRadius: 10,
shadowOpacity: 0.3
}}/>
}
if(route.name === "Living Room"){
return <Ionicons name="ios-chatbubbles" size={28} />
}
},
})}
tabBarOptions={{
activeTintColor: "#FF6E65",
height: 100,
paddingVertical: 10
}}
>
<Tab.Screen name="Home" component={Home} />
<Tab.Screen name="Post" component={Post} />
<Tab.Screen name="Living Room" component={LivingRoom} />
</Tab.Navigator>
);
}
function StackNavigator({ navigation }){
return (
<Stack.Navigator
// initialRouteName="Comment"
>
<Stack.Screen name="Login" component={Login} options={{headerShown: false}} />
<Stack.Screen name="Signup" component={Signup} options={{ title: 'Sign up' }}/>
<Stack.Screen name="TabNavigator" component={TabNavigator} options={{
title: "Home" ,
headerLeft: () => (
<TouchableOpacity onPress={
() => navigate('Camera')
}>
<Ionicons style={{marginLeft: 10}} name={'ios-camera'} size={30}/>
</TouchableOpacity>
),
gestureEnabled: false,
headerRight: () => (
<TouchableOpacity onPress={
() => navigation.openDrawer()
}>
<MaterialIcons style={{marginRight: 10}} name={'people'} size={30}/>
</TouchableOpacity>
),
}}/>
<Stack.Screen name="Camera" component={CameraScreen} options={{ headerShown: false }}/>
<Stack.Screen name="Comment" component={CommentScreen} options={{ headerShown: true }}/>
</Stack.Navigator>
);
}
function CustomDrawerContent(props) {
const username = useSelector(state => state.user.username);
const avatar = useSelector(state => state.user.avatar);
return (
<DrawerContentScrollView {...props} >
<ImageBackground
source={require("../assets/background.png")}
style={{ width: undefined, padding: 16, paddingTop: 48 }}
>
<Image source={{uri: avatar}} style={styles.profile} />
<Text style={styles.name}>{username}</Text>
</ImageBackground>
<DrawerItemList {...props} />
</DrawerContentScrollView>
);
}
function MyDrawer() {
return (
<Drawer.Navigator drawerPosition={'right'} drawerStyle={{
backgroundColor: '#fff',
}} drawerContentOptions={{
activeBackgroundColor: '#FF6E65',
activeTintColor: "#FFF",
}} drawerContent={props => <CustomDrawerContent {...props} />}>
<Drawer.Screen name="Home" component={StackNavigator} />
<Drawer.Screen name="My Profile" component={Profile} />
</Drawer.Navigator>
);
}
function AuthNavigator() {
// console.log(navigation)
return (
<NavigationContainer ref={navigationRef}>
<MyDrawer/>
</NavigationContainer>
);
}
export default (AuthNavigator)
这是我的标签导航代码:
import * as React from 'react';
import { NavigationContainer } from '@react-navigation/native';
import { createBottomTabNavigator } from '@react-navigation/bottom-tabs';
import Home from '../screens/Home.js';
import Search from '../screens/Search.js'
import Activity from '../screens/Activity.js'
import Post from '../screens/Post.js'
import Profile from '../screens/Profile.js'
import {Ionicons} from '@expo/vector-icons'
// import { HomeNavigator } from './StackNavigator.js'
const Tab = createBottomTabNavigator();
export default class TabNavigator extends React.Component {
render(){
return (
<Tab.Navigator
screenOptions={({ route }) => ({
tabBarIcon: ({ color, size, focused }) => {
if(route.name === "Home"){
return <Ionicons name="ios-home" size={32} />
}
if(route.name === "Search"){
return <Ionicons name="ios-search" size={32} />
}
if(route.name === "Post"){
return <Ionicons name="ios-add-circle-outline" size={32}/>
}
if(route.name === "Activity"){
return <Ionicons name={focused ? "ios-heart" : "ios-heart-empty"} size={32} />
}
if(route.name === "Profile"){
return <Ionicons name="ios-person" size={32} />
}
},
})}
tabBarOptions={{
height: 100,
paddingVertical: 10
}}
>
<Tab.Screen name="Home" component={Home} />
<Tab.Screen name="Search" component={Search} />
<Tab.Screen name="Post" component={Post} />
<Tab.Screen name="Activity" component={Activity} />
<Tab.Screen name="Profile" component={Profile} />
</Tab.Navigator>
);
}
}
我尝试在登录和注册堆栈屏幕中将手势设置为 false,但这只会消除堆栈屏幕本身的手势,而不是抽屉本身的手势。我希望抽屉只能从选项卡导航器访问,但 React Navigation 5.x 说要将所有内容嵌套在抽屉本身下。我该怎么办?谢谢!
解决方案
推荐阅读
- python - 在 plt.bar 中对值进行排序
- android - 检查广播接收器是否工作
- vaadin - 如何在 Vaadin 中打印组件?
- java - 尝试从 db 中选择时,时间戳格式必须为 yyyy-mm-dd hh:mm:ss[.fffffffff]
- rust - tokio是多线程的吗?
- opencart - Opencart 3.0.3.3 上的这段代码有什么问题
- python - 如何在 django 中使用列表字段
- excel - 从单元格中获取值
- javascript - React Native:这个组件是怎么调用的?
- java - Selenium junit 测试失败,驱动程序太快获取 URL