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

Expo Router应用满足显示引导页条件却始终显示首页的问题求助

Expo Router应用满足显示引导页条件却始终显示首页的问题求助

各位好,我现在遇到一个棘手的问题:我基于React Native + Expo Router开发的应用,明明满足显示引导页的条件,但每次启动后都会直接跳转到首页。我已经做了不少排查工作,但还是没定位到问题,想请大家帮忙分析一下。

已验证的内容

  • 存储检查逻辑正常:调用getItem获取@viewedOnboarding时,确实返回null或false,按照业务逻辑此时应该显示引导页
  • 状态更新正确:showOnboarding最终会被设置为true,控制台日志可以明确确认这一点
  • 条件渲染逻辑看起来没有问题
  • 文件路径正确:onboarding.tsx确实放在app/onboarding.tsx目录下

当前实际行为

  • 无论存储返回的状态如何,应用始终直接加载首页(index)
  • 控制台日志显示,在渲染阶段showOnboarding的值确实是true
  • 控制台没有任何报错信息

相关代码

import React from "react";
import { View, StyleSheet } from "react-native";
import { GestureHandlerRootView } from "react-native-gesture-handler";
import { SplashScreen, Stack } from "expo-router";
import { useEffect, useState } from "react";
import { getItem } from "../utils/storage";

SplashScreen.preventAutoHideAsync();

export default function Layout() {
  const [showOnboarding, setShowOnboarding] = useState<boolean | null>(null);
  console.log("[Layout] Rendering. Current showOnboarding:", showOnboarding);

  useEffect(() => {
    console.log("[useEffect] Starting onboarding check");
    const checkOnboardingStatus = async () => {
      try {
        console.log(
          "[checkOnboardingStatus] Fetching onboarding status from storage"
        );
        const hasViewed = await getItem<boolean>("@viewedOnboarding");
        console.log("[checkOnboardingStatus] Storage returned:", hasViewed);
        const shouldShowOnboarding = hasViewed !== true;
        console.log(
          "[checkOnboardingStatus] Setting showOnboarding to:",
          shouldShowOnboarding
        );
        setShowOnboarding(shouldShowOnboarding);
      } catch (error) {
        console.error(
          "[checkOnboardingStatus] Error checking onboarding:",
          error
        );
        console.warn(
          "[checkOnboardingStatus] Defaulting to show onboarding due to error"
        );
        setShowOnboarding(true);
      } finally {
        console.log("[checkOnboardingStatus] Hiding splash screen");
        SplashScreen.hideAsync();
      }
    };

    checkOnboardingStatus();
  }, []);

  if (showOnboarding === null) {
    console.log("[Render] showOnboarding is null - returning null");
    return null;
  }

  console.log("[Render] Final showOnboarding value:", showOnboarding);
  console.log(`[Render] Will ${showOnboarding ? "show" : "hide"} onboarding`);

  return (
    <GestureHandlerRootView style={styles.container}>
      <Stack>
        {showOnboarding ? (
          <>
            <Stack.Screen name="onboarding" options={{ headerShown: false }} />
            <Stack.Screen name="+not-found" />
          </>
        ) : (
          <Stack screenOptions={{ headerShown: false }}>
            <Stack.Screen name="index" />
            <Stack.Screen name="+not-found" />
          </Stack>
        )}
      </Stack>
    </GestureHandlerRootView>
  );
}

const styles = StyleSheet.create({
  container: {
    flex: 1,
  },
});

我想确认的是:按照我的代码逻辑,当showOnboarding = true时,应该渲染引导页才对,对吧?但实际却没有生效,有没有大佬能帮我找找哪里出了问题?

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.08 12:33:03