我不理解React导航行为

ttisahbt  于 6个月前  发布在  React
关注(0)|答案(2)|浏览(67)

我在一个react-native(typescript)应用程序中有这个函数:

import { LoginProps } from '../types';

export const signOut = async (auth: Auth, nav: LoginProps['navigation'], setUser: any) => {
    try {
        await auth.signOut();
        nav.navigate('Login');
        setUser(null);
    } catch (error) {
        console.log(error);
    }
}

字符串
这个函数按预期工作,但如果我注解或删除这一行:await auth.signOut();
错误代码:The action 'NAVIGATE' with payload {"name":"Login"} was not handled by any navigator.
同样的事情,如果我尝试只是导航,而不做任何其他的功能。
我不明白这两条线是如何联系在一起的,为什么第一条线对第二条线是必要的。
我在测试解决this post问题时遇到了这个问题。
以下是我的类型:

export type RootStackParamList = {
    Home: undefined;
    Login: undefined;
    Register: undefined;
    Game: { roomId: string | null };
}

export type NavigationProps<T extends keyof RootStackParamList> = {
    navigation: StackNavigationProp<RootStackParamList, T>;
}

export type HomeProps = NavigationProps<'Home'>;
export type LoginProps = NavigationProps<'Login'>;
export type RegisterProps = NavigationProps<'Register'>;
export type GameProps = NavigationProps<'Game'>;

u91tlkcl

u91tlkcl1#

请看这里:https://reactnavigation.org/docs/auth-flow
我想只有这一行才能导航到登录

await auth.signOut();

字符串
不是这一行:

nav.navigate('Login');


因为如果auth = null,Navigator会自动选择LoginScreen。所以代码nav.navigate('Login');是多余的,你不需要它。
这就是为什么你不能通过注解这一行await auth.signOut();导航到Login的原因。

5cnsuln7

5cnsuln72#

这是因为我的屏幕是这样定义的:

return (
    <NavigationContainer>
      <Stack.Navigator>
        {user ? (
          <>
            <Stack.Screen
              name="Home"
              component={Home}
              options={{ headerShown: false }}
            />
            <Stack.Screen
                name='Game'
                component={Game}
                options={{ headerShown: false }}
            />
          </>
        ) : (
          <>
            <Stack.Screen
              name='Login'
              component={Login}
              options={{ headerShown: false }}
            />
            <Stack.Screen
              name='Register'
              component={Register}
              options={{ headerShown: false }}
            />
          </>
        )}
      </Stack.Navigator>
    </NavigationContainer>
  );

字符串
正如你所看到的,变量user必须是未定义的,才能定义登录屏幕,所以如果用户被连接,登录屏幕在上下文中保持未定义,因此,不被任何导航器处理。

编辑:

我在发帖后5分钟就找到了答案,但因为太快了,所以无法自动回答。
不幸的是,我后来忘了回到网上发布它......但我收到了来自@famfamfam的很好的回应:)

相关问题