我有一个移动应用程序,该应用程序提供了几个功能.主要有两组功能:用户特定的功能(如愿望列表等)和一般功能(如新闻、关于我们等).我是新的 react native ,我想有这两个组在不同的导航"部分":用户特定的东西应该在BottomTabNavigator以内,而一般的东西应该在DrawerNavigator内.

我的问题与How to use Multiple Navigators in React Native version 6.x非常相似,但与那个问题不同的是,我希望选项卡中有different个元素.

我曾try 将这两个导航器嵌套成一个,如下所示:

import 'react-native-gesture-handler';
import { PaperProvider, MD3LightTheme as DefaultTheme } from 'react-native-paper';
import {SafeAreaView, View, Text} from "react-native";
import {StatusBar} from 'expo-status-bar';
import {NavigationContainer} from '@react-navigation/native';
import { createDrawerNavigator } from '@react-navigation/drawer';
import { createBottomTabNavigator } from '@react-navigation/bottom-tabs';
import Header from "./components/Header";
/* *screen imports here* */


const Drawer = createDrawerNavigator();
const Tab = createBottomTabNavigator();

function TabNav() {
    return (
        <Tab.Navigator>
            <Tab.Screen name="Wishes" component={ScreenWishlist} />
            <Tab.Screen name="History" component={ScreenHistory} />
        </Tab.Navigator>
    )
}

export default function App()
{
    return (
        <View style={{flex:1, backgroundColor:"#800"}}>
            <SafeAreaView style={{flex:1}}>
                <View style={{flex:1, backgroundColor:"#fff"}}>
                    <PaperProvider theme={theme}>
                        <StatusBar translucent={false} hidden={false} style={"light"} backgroundColor={'#800'} />

                        <NavigationContainer>
                            <Drawer.Navigator screenOptions={{
                                header: Header
                            }}>
                                <Drawer.Screen name="tabs" component={TabNav} />
                                <Drawer.Screen name="News" component={ScreenNews} />
                                <Drawer.Screen name="About" component={ScreenAboutUs} />
                            </Drawer.Navigator>
                        </NavigationContainer>

                    </PaperProvider>
                </View>
            </SafeAreaView>
        </View>
    );
}

这里的问题是,在更换了一些屏幕后,我失go 了底部导航器.

我也试过用两个NavigationContainer,就像这样:

import 'react-native-gesture-handler'; // make sure it's at the top and there's nothing else before it
import { PaperProvider, MD3LightTheme as DefaultTheme } from 'react-native-paper';
import {SafeAreaView, View, Text} from "react-native";
import {StatusBar} from 'expo-status-bar';
import {NavigationContainer} from '@react-navigation/native';
import { createDrawerNavigator } from '@react-navigation/drawer';
import { createBottomTabNavigator } from '@react-navigation/bottom-tabs';
import Header from "./components/Header";
/* *screen imports here* */

const Drawer = createDrawerNavigator();
const Tab = createBottomTabNavigator();

export default function App()
{
    return (
        <View style={{flex:1, backgroundColor:"#800"}}>
            <SafeAreaView style={{flex:1}}>
                <View style={{flex:1, backgroundColor:"#fff"}}>
                    <PaperProvider>

                        <NavigationContainer>
                            <Drawer.Navigator screenOptions={{
                                header: Header
                            }}>
                                <Drawer.Screen name="News" component={ScreenNews} />
                                <Drawer.Screen name="About" component={ScreenAboutUs} />
                            </Drawer.Navigator>
                            
                        </NavigationContainer>

                        <NavigationContainer>
                            <Tab.Navigator>
                                <Tab.Screen name="Wishes" component={ScreenWishlist} />
                                <Tab.Screen name="History" component={ScreenHistory} />
                            </Tab.Navigator>
                        </NavigationContainer>

                    </PaperProvider>
                </View>
            </SafeAreaView>
        </View>
    );
}

这里的问题是,它的渲染就像是有两个不同的屏幕,整个屏幕在中间分割,两个屏幕独立工作.我想一次只渲染一个屏幕,而且应该覆盖整个屏幕-当然,除了导航按钮,我希望所有时间都渲染两个导航控制器按钮.

The The opened navi which I want to keep, just like the bottom navi

推荐答案

我认为这是不可能的.

你可以使用Stack Navigator,它不会渲染任何按钮,所以你可以用React Native Paper DrawerBottomNavigation制作你自己的按钮.

您可能希望突出显示选定的导航菜单,以便用户知道他们在哪个屏幕上.要做到这一点,您需要获取当前屏幕的名称,并判断每个按钮.您可以像这样获取当前屏幕(来自ChatGPT):

const navigation = useNavigation();
const currentScreen = navigation.dangerouslyGetState().routes[navigation.dangerouslyGetState().index].name;

或者,您可以在每个屏幕的useEffect()个屏幕上设置全局状态(Redux或Context).

React-native相关问答推荐

添加REACT-Native-SVG时出现错误-失败:构建失败并出现异常

错误发生意外错误:https://registry.yarnpkg.com/react-native-template-react-native-template-typescript:未找到

图像背景ResizeMode调整大小模式

设置 rootView.appProperties 不会重新渲染根组件

缺少请求的请求令牌

Undefined 不是判断 this.state.* 的对象

可以在没有 await 关键字的情况下调用异步函数吗?

如何在react native应用程序名称中添加空格?

React Native - NSNumber 无法转换为 NSString

没有找到 `React-fishhook` 的 podspec

React Native Negative shadowOffset 创建顶部阴影

通过 ToolbarAndroid => onIconClicked 显示 DrawerLayoutAndroid

DeviceInfo 原生模块未正确安装

您将如何在 Alert 中模拟onPress?

React Native:如何将文件拆分为多个文件并导入它们?

React-native Awesome 元素没有构建 android 元素

为什么我收到警告:函数作为 React 子级无效?

React Native 项目,有时使用 expo start 获得连接 ECONNREFUSED 127.0.0.1:19001

将 colored颜色 变量导入我的样式

如何在 React Native 中强制禁用 iOS 暗模式