You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Expo Router无法检测路由求助(Expo SDK 52 + TypeScript)

Expo Router无法检测路由问题(SDK 52 + TypeScript)

我目前正在使用Expo SDK 52和TypeScript开发项目,采用Expo Router实现页面导航,在开发认证系统时遇到问题:Expo Router无法检测我的路由!

文件夹结构

app
  admin
    _layout.tsx
    index.tsx
    menu.tsx
  auth
    _layout.tsx
    forgotPassword.tsx
    index.tsx (login)
  client
    _layout.tsx
    index.tsx
    menu.tsx
  _layout.tsx
  +not-found.tsx
routes
  protected.routes.tsx

app/_layout.tsx 代码

import {
  DarkTheme,
  DefaultTheme,
  ThemeProvider,
} from '@react-navigation/native';
import { useFonts } from 'expo-font';
import { Stack, useRootNavigationState, useSegments } from 'expo-router';
import * as SplashScreen from 'expo-splash-screen';
import { StatusBar } from 'expo-status-bar';
import { useEffect } from 'react';
import 'react-native-reanimated';
import { QueryClient, QueryClientProvider } from 'react-query';

import { useColorScheme } from '@/hooks/useColorScheme';
import { AuthProvider } from '@/context/auth.context';
import ToastProvider from '@/context/toast.context';

SplashScreen.preventAutoHideAsync();

export default function RootLayout() {
  const colorScheme = useColorScheme();
  const [loaded] = useFonts({
     'Inter-Light': require('../assets/fonts/Inter/Inter-Light.ttf'),
     'Inter-Regular': require('../assets/fonts/Inter/Inter-Regular.ttf'),
     'Inter-Medium': require('../assets/fonts/Inter/Inter-Medium.ttf'),
     'Inter-SemiBold': require('../assets/fonts/Inter/Inter-SemiBold.ttf'),
     'Inter-Bold': require('../assets/fonts/Inter/Inter-Bold.ttf'),
     'Inter-ExtraBold': require('../assets/fonts/Inter/Inter-ExtraBold.ttf'),
     'Bagoss-Regular': require('../assets/fonts/Bagoss/BagossStandardTRIALRegular.ttf'),
     'Bagoss-Medium': require('../assets/fonts/Bagoss/BagossStandardTRIAL-Medium.ttf'),
     'Bagoss-Bold': require('../assets/fonts/Bagoss/BagossStandardTRIAL-Bold.ttf'),
     'Bagoss-Light': require('../assets/fonts/Bagoss/BagossStandardTRIAL-Light.ttf'),
   });

   console.log(useRootNavigationState());
   console.log('-------', useSegments());

   const queryClient = new QueryClient({
     defaultOptions: {
       queries: { retry: true },
     },
   });

   useEffect(() => {
     if (loaded) {
       SplashScreen.hideAsync();
     }
   }, [loaded]);

   if (!loaded) {
      return null;
   }

   return (
      <AuthProvider>
       <ToastProvider>
          <QueryClientProvider client={queryClient}>
            <ThemeProvider
             value={colorScheme === 'dark' ? DarkTheme : DefaultTheme}
            >
              <Stack />
            <StatusBar style="auto" />
           </ThemeProvider>
        </QueryClientProvider>
     </ToastProvider>
   </AuthProvider>
  );
}

routes/protected.routes.tsx 代码

import { useAuth } from '@/hooks/useAuth';
import { Redirect, Slot, useSegments } from 'expo-router';
import { ReactNode } from 'react';

type ProtectedRouteProps = {
  children: ReactNode;
};

export default function ProtectedRoute({ children }: ProtectedRouteProps) {
  const { auth } = useAuth();
  const segments = useSegments();

  if (!auth) {
    return <Redirect href="/auth" />;
  }

  if (segments[0] === 'admin' && auth.role !== 'admin') {
    return <Redirect href="/client" />;
  }

  if (segments[0] === 'client' && auth.role !== 'client') {
    return <Redirect href="/admin" />;
  }

  return <Slot />;
}

控制台日志输出

console.log(useRootNavigationState()); // {"index": 0, "key": "stack-GkzxKtSO4HYHhXeZIWrdu", "preloadedRoutes": [], "routeNames": ["auth", "tabs", "admin", "client", "_sitemap", "+not-found"], "routes": [{"key": "+not-found-ziqvXfNdJaLXTtm-nGB2y", "name": "+not-found", "params": undefined, "path": ""}], "stale": false, "type": "stack"}
console.log(useSegments()); // ["+not-found"]

使用的版本信息

  • expo: ~52.0.33
  • expo-router: ~4.0.17
  • react-native: 0.76.7
  • react: 18.3.1

内容的提问来源于stack exchange,提问作者Omar Zaoujal

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 07:54:56