goBack 不工作嵌套导航器反应本机 0.70

问题描述 投票:0回答:0

我在使用 nested stacks - nested navigators.

来回导航时遇到问题

我已经阅读了几个解决方案,“修补”这个问题的方法,但都没有用。 如果我在我的 Tab.Navigator 内的其他堆栈中,并且我在该堆栈(示例 AssetStacks)中导航,我可以使用标题按钮(设置为 tabBottomHome)返回该堆栈,并使用函数

navigation.pop ()
- 使用 tabsBottomHome 组件的属性,但如果我想用相同的箭头返回主页,它会抛出错误 -->

The action 'POP' with payload {"count":1} was not handled by any browser.

Is there any screen to go back to?

所以这个带有

navigation.goBack()
的处理程序,它跳转到父组件/堆栈,在这种情况下是 tabsBottomHome,这意味着它带我到主页,并且 不会返回到堆栈的前一个屏幕我正在浏览。或者在 Tab.Navigator 中使用 backBehavior = {'firstRoute'} 显示这个

The action 'GO_BACK' was not handled by any navigator.

Is there any screen to go back to?

导航的navigation结构是这样的-->

RootStack(Stack--> Index.tsx)
|--Login Screen(not logged)
|--ErrorLogin Screen(not logged)
|--TabsBottomHome(logged)
|   |--ConversationsStack
|   |--TaskStack
|   |--Home
|   |--AssetsStack
|      |--AssetScreen1
|      |--AssetScreen2
|
|   |--ConnectGatewayStack
|      |--GatewayScreen 1
|      |--GatewayScreen 2
|      |--GatewayScreen 3
|      |--GatewayScreen 4
|      |--GatewayScreen 5
|
|--

首先,我在 Index.tsx 中有我的第一个堆栈,它处理登录或登录中的错误以及以下身份验证 -->

import React, { useEffect, useContext } from 'react';

import { NavigationContainer } from '@react-navigation/native';
import {
  createStackNavigator,
} from '@react-navigation/stack';
import { Alert, Platform, Pressable } from 'react-native';
import LoginScreen from '@screens/login/LoginScreen';
import LoginError from '@screens/login/LoginError';
import { AppContext, Types } from '@contexts/appContext';
import TabsBottomHome from '@navigation/tabsBottomNavigation/tabsBottomHome';
import { firebase } from '@react-native-firebase/messaging';
import Header from '@components/header/Header';
import HeaderBackground from '@components/header/HeaderBackground';
import ArrowLeft from '@assets/images/arrow_left.svg';
import HeaderRight from '@components/header/HeaderRight';


export type RootStackParamList = {
  tabsBottomHome: undefined;
  Login: undefined;
  LoginError: undefined;
};

const Stack = createStackNavigator<RootStackParamList>();
const Index = () => {
  const { state, dispatch } = useContext(AppContext);
  console.log("🚀 ~ file: Index.tsx:67 ~ Index ~ state", state);

  return (
    <>
      <NavigationContainer>
        <Stack.Navigator initialRouteName='tabsBottomHome'
          screenOptions={{
            headerTitle: () => <Header />,
            headerBackground: () => <HeaderBackground />,
            headerLeft: ({ onPress, canGoBack }) =>
              canGoBack ? (
                <Pressable onPress={onPress} style={{ width: 30, height: 15 }}>
                  <ArrowLeft height={15} width={15} style={{ marginLeft: 15 }} />
                </Pressable>
              ) : (
                <Pressable style={{ width: 65, height: 35 }}></Pressable>
              ),
            headerRight: () => <HeaderRight />,
          }}
        >
          {state.isSignIn ? (
            <>
              <Stack.Screen
              name='tabsBottomHome'
              component={TabsBottomHome}
              options={{headerShown: false }}
              />
            </>
          ) : (
            <>
              <Stack.Screen
                name="Login"
                component={LoginScreen}
                options={{ headerShown: false }}
              />
              <Stack.Screen
                name="LoginError"
                component={LoginError}
              />
            </>
          )}
        </Stack.Navigator>
      </NavigationContainer>
    </>
  );
};

export default Index;

注意:索引中的header仅在LoginError中显示。

我的标签底部导航 -->

import React, { useState } from 'react';
import {  Image, Pressable, StyleSheet, View } from 'react-native';
import { createBottomTabNavigator } from '@react-navigation/bottom-tabs';
import { useNavigation } from '@react-navigation/core';
import Header from '@components/header/Header';
import HeaderRight from '@components/header/HeaderRight';
import HeaderBackground from '@components/header/HeaderBackground';
import HomeScreen from '@screens/home/HomeScreen';
import ConversationScreen from '@screens/conversations/ConversationScreen';
import TaskScreen from '@screens/task/TaskScreen';
import Profile from '@screens/profile/Profile';
import NotificationScreen from '@screens/notifications/NotificationScreen';

import { ConnectGatewayStack }  from '../stacks/ConnectGatewayStack';
import { AssetsStack } from '../stacks/AssetsStack';
import { StackActions } from '@react-navigation/native';
export type RootTabParamListBottom = {
    Home: undefined;
    Assets: {} | undefined;
    Tasks: undefined;
    Conversations:undefined;
    Profile: undefined;
    Notifications: undefined;
    GatewayStack : undefined;
};
const Tab = createBottomTabNavigator<RootTabParamListBottom>();

const TabsBottomHome = ({navigation}:any) => {
    const [routeName, setRouteName] = useState<string>("");
    const navigateBack = ()=>{
        navigation.pop();
    }
    return (
        <>
        <Tab.Navigator
                initialRouteName='Home'
                screenOptions={{
                    headerShown:true, 
                    tabBarShowLabel:false,
                    tabBarStyle:style.tabsBottomContainer,
                    tabBarHideOnKeyboard: true,
                    unmountOnBlur: true,
                    headerTitle: () => <Header />,
                    headerBackground: () => <HeaderBackground />,
                    headerLeft: () =>
                        routeName != "Home" ? (
                            <Pressable onPress={navigateBack} style={{ width: 65, height: 15 }}>
                              <ArrowLeft height={15} width={15} style={{ marginLeft: 15 }} />
                            </Pressable>
                        ) 
                        : (
                            <Pressable style={{ width: 65, height: 35 }}></Pressable>
                        )
                      ,
                    headerRight: () => <HeaderRight />,
                }}
                sceneContainerStyle={style.backgroundContent}
                screenListeners={({route})=>({
                    state: ()=> {
                        setRouteName(route.name);
                    }
                  })}
                backBehavior={'history'}
                >
                   <Tab.Screen 
                    name='Assets'
                    component={ AssetsStack }
                    options={{tabBarIcon:({focused,color})=>(
                        <View>
                           <Image
                            source={iconAsset}
                            style={{
                                tintColor: focused ? '#00B2DF' : '',
                                marginTop: 8
                            }}
                                />
                        </View>
                    )}} />
                   <Tab.Screen 
                    name='GatewayStack'
                    component={ConnectGatewayStack}
                    options={{tabBarIcon:({focused,color})=>(
                        <View>
                           <Image
                            source={iconBluetooth}
                            style={{
                                tintColor: focused ? '#00B2DF' : ''
                            }}
                                />
                        </View>
                    )}} />
                    <Tab.Screen 
                        name='Home'
                        component={HomeScreen}
                        options={{tabBarIcon:({focused,color})=>(
                            <View>
                               <Image
                                source={iconHome}
                                style={{
                                    tintColor: focused ? '#00B2DF' : ''
                                }}
                                />
                            </View>
                            )
                       }} />
                    <Tab.Screen 
                     name='Tasks'
                     component={TaskScreen}
                     options={{tabBarIcon:({focused,color})=>(
                         <View>
                            <Image
                                source={iconTask}
                                style={{
                                    tintColor: focused ? '#00B2DF' : ''
                                }}
                                />
                         </View>
                     )}} />
                    <Tab.Screen 
                     name='Conversations'
                     component={ConversationScreen}
                     options={{tabBarIcon:({focused,color})=>(
                        <View>
                           <Image
                            source={iconChat}
                            style={{
                                tintColor: focused ? '#00B2DF' : ''
                            }}
                            />
                        </View>
                     )}} />
                    <Tab.Screen 
                     name='Profile'
                     component={Profile}
                     options={{
                         tabBarButton: () => null,
                       }} />
                    <Tab.Screen 
                     name='Notifications'
                     component={NotificationScreen}
                     options={{
                         tabBarButton: () => null,
                       }} />
        </Tab.Navigator>       
        </>
    );
}

export default TabsBottomHome;

AssetStack

import React from 'react';
import {createStackNavigator} from '@react-navigation/stack';
import {ListAssetsScreen} from '@screens/assets/ListAssetsScreen';
import {DetailAssetScreen} from '@screens/assets/DetailAssetScreen';
import {AssetProvider} from '@contexts/assetContext';
import {ThemeProvider} from './../../theme/themeContext';

export type StackAssetsList = {
  ListAssets: {} | undefined;
  DetailAsset: {} | undefined;
};

const Stack = createStackNavigator<StackAssetsList>();

const AssetsStack = () => {
  return (
    <ThemeProvider>
      <AssetProvider>
        <Stack.Navigator
          initialRouteName="ListAssets"
          screenOptions={{headerShown: false}}>
          <Stack.Screen name="ListAssets" component={ListAssetsScreen} />
          <Stack.Screen name="DetailAsset" component={DetailAssetScreen} />
        </Stack.Navigator>
      </AssetProvider>
    </ThemeProvider>
  );
};

export {AssetsStack};


"@react-navigation/bottom-tabs": "^6.5.4",
"@react-navigation/native": "^6.1.3",
"@react-navigation/stack": "^6.3.12",

有什么想法吗?导航做得好吗?

注意:如果你没注意到,我是小学生。

非常感谢您的关注和时间。

reactjs react-native react-navigation react-navigation-bottom-tab react-navigation-v6
© www.soinside.com 2019 - 2024. All rights reserved.