从异步存储中获取 initialRouteName 时出现问题

Problems fetching initialRouteName from Async Storage

我是 React 的新手,希望您能多多包涵。

我想在用户第一次打开应用程序时向他们展示引导屏幕。第二次,我想显示登录屏幕。

我的做法是更改OnboardingStack.Navigator中的initialRouteName。在第一次启动时它应该是 'Onboarding' 在第二次启动时 'Login'。我正在使用 asycnStorage 来存储这些值。

应用程序打开后,'Login' 将添加到 LaunchStatusKey。在第二次打开时,它应该注册 LaunchStatusKey 实际上是 'Login',这应该继续并将 initialRouteName 设置为 'Login'。但这是行不通的。

我怀疑在等待和启动我的应用程序之间存在时间延迟,在它可以获取 LaunchStatusKey 并将 initialRouteName 设置为 'Login' 之前,它启动并使用默认值 'Onboarding'

关于如何解决这个问题有什么想法吗?

感谢阅读!

const OnboardingStack = createStackNavigator();

const App = ({ navigation }) => {

  const [initialRouteName, setInitialRouteName] = useState('')

  const save = async () => {
    try {
      await AsyncStorage.setItem("launchStatusKey", initialRouteName)
    } catch (err) {
      alert(err);
    }
  };
  save();

  const load = async () => {
    try {
      let key = await AsyncStorage.getItem("launchStatusKey")
      if (key === null) {
        console.log('It is empty')
        setInitialRouteName('Login')
      } else {
        console.log('It is not empty')

      }
    } catch (err) {
      alert(err);
    }
  }; 

  useEffect(() => {
    load();
  },);

  return (
    <NavigationContainer>
      <OnboardingStack.Navigator initialRouteName={initialRouteName}>
        <OnboardingStack.Screen name="Onboarding" component=         {OnboardingScreen} />
        <OnboardingStack.Screen
          name="Login"
          component={LoginScreen}
          options={{ header: () => null }}
        />
        <OnboardingStack.Screen
          name='SignUp'
          component={SignUpScreen}
        />
        <OnboardingStack.Screen
          name='Home'
          component={AppTabsScreen}
        />
        <OnboardingStack.Screen
          name={'Loading'}
          component={LoadingScreen}
        />
      </OnboardingStack.Navigator>
    </NavigationContainer>
  );
}

您可以使用您的状态来检查存储中的密钥是否已加载:

const [statusKeyLoaded, setStatusKeyLoaded] = useState(false)

加载密钥后,将此状态设置为 true:

let key = await AsyncStorage.getItem("launchStatusKey")
setStatusKeyLoaded(true)

然后仅当您知道您的密钥已加载时才呈现视图:

return (
   <>
    {statusKeyLoaded && (
    <NavigationContainer>
       ....
    </NavigationContainer> )}
   </>