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

React Native问题:引导页完成后仍重复出现

问题分析与解决方案

从你的代码和日志来看,核心问题出在路由路径匹配和布尔值判断逻辑的严谨性上,以下是具体修复步骤:

1. 修正路由路径匹配

你的RootLayout中主页面的路由名称是"home/HomeScreen",但需确保这个名称与你的文件结构完全对应:

  • 如果主页面文件是app/home.js,路由名称应改为"home"
  • 如果主页面文件是app/home/HomeScreen.js,路由名称保持"home/HomeScreen"

错误的路由名称会导致expo-router无法找到对应页面,默认 fallback 到index(引导页),这就是你完成引导后仍回到引导页的主要原因之一。

修改后的RootLayout路由部分:

return (
  <Stack screenOptions={{ headerShown: false }}>
    {showOnBoarding ? (
      <Stack.Screen
        name="index"
        options={{ gestureEnabled: false, animation: "none" }}
      />
    ) : (
      // 根据你的实际文件结构修改路由名称
      <Stack.Screen
        name="home" 
        options={{ gestureEnabled: false, animation: "none" }}
      />
    )}
  </Stack>
);

2. 严谨化布尔值判断逻辑

当前代码中setShowOnBoarding(!onboarded)的判断存在歧义:日志显示onboarded的值是1(数字类型),!1会返回false,逻辑上应该跳转到主页面,但如果之前存储过非布尔值的旧数据,可能导致判断异常。

修改checkIfAlreadyOnBoarded函数,明确判断是否为布尔值true:

const checkIfAlreadyOnBoarded = async () => {
  try {
    const onboarded = await getItem("onboarded");
    // 仅当onboarded严格等于true时,才跳过引导页
    setShowOnBoarded(onboarded !== true);
  } catch (error) {
    console.error("Error checking onboarded status:", error);
    setShowOnBoarded(true);
  }
};

3. 验证存储与读取的一致性

在引导页的handleDone函数中添加日志,确认值是否正确存储:

const handleDone = async () => {
  try {
    await setItem("onboarded", true);
    // 验证存储后的值
    const storedValue = await getItem("onboarded");
    console.log("Stored onboarded value:", storedValue); // 应输出true
    // 对应修改后的路由路径
    router.replace("/home");
  } catch (error) {
    console.error("Error storing onboarded value:", error);
  }
};

4. 清除旧的测试数据

如果之前存储过非布尔值的旧数据(比如日志中的1),需要先清除:

// 在测试时执行一次,清除旧值
await removeItem("onboarded");

内容的提问来源于stack exchange,提问作者Jennifer Graham

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 17:53:10