React Native 导航 5 身份验证流程

2024-03-06

我似乎无法在我的 App.js 文件上进行三元身份验证。我正在检查是否有密钥,然后根据该密钥的存在显示 AuthStack 或 MainStack。当我从 AuthStack 转到 MainStack(将密钥设置为 AsyncStorage)时,我收到错误 - 任何导航器均未处理带有有效负载 {'name':'Home'} 的操作 'NAVIGATE'。当我注销或删除密钥时也会发生同样的情况。

根据文档,用户在经过身份验证后似乎会立即导航到应用程序,但这似乎不起作用。

应用程序.js 文件

import React, { useState, useEffect } from 'react';
import AsyncStorage from '@react-native-community/async-storage';

import { NavigationContainer } from '@react-navigation/native';
import AuthStack from './src/navigation/AuthStack'
import MainStack from './src/navigation/MainStack'

export default function App({ navigation }) {
  const [userKey, setUserKey] = useState(null)

  useEffect(() => {
    const bootstrapAsync = async () => {

      try {
        let userKey = await AsyncStorage.getItem('userKey')
        setUserKey(userKey)

      } catch (e) {
        // Restoring token failed
      }

    }

    bootstrapAsync()
  }, [])

  return (
    <NavigationContainer >
      {userKey == null ? (
        <AuthStack />
      ) : (
          <MainStack />
        )}
    </NavigationContainer>
  );
}

认证栈

function AuthStack() {
    return (
        <Stack.Navigator>
            <Stack.Screen name="Login" component={LoginScreen} />
            <Stack.Screen name="ForgotPassword" component={ForgotPasswordScreen} />
            <Stack.Screen name="SignUp" component={SignUpScreen} />
        </Stack.Navigator>
    )
}

export default AuthStack

主栈

function MainStack({ navigation, route }) {
    return (
        <Stack.Navigator>
            <Stack.Screen name='Home' component={HomeScreen} />
        </Stack.Navigator>
    )
}

export default MainStack

这是使用 React-navigation v5 的最小身份验证设置。

import * as React from 'react';

import { Text, View, StyleSheet } from 'react-native';

import { Button, TextInput } from 'react-native-paper';

import { NavigationContainer } from '@react-navigation/native';
import { createStackNavigator } from '@react-navigation/stack';

import Constants from 'expo-constants';

const Stack = createStackNavigator();

const Auth = React.createContext(null);

export function Login() {
  const [email, setEmail] = React.useState('');
  const [pass, setPass] = React.useState('');
  
  const { setToken } = React.useContext(Auth)

  return (
    <View style={styles.container}>
      <TextInput
        label="Email"
        value={email}
        style={styles.input}
        onChangeText={(t) => setEmail(t)}
      />

      <TextInput
        label="Password"
        value={pass}
        style={styles.input}
        onChangeText={(t) => setPass(t)}
      />

      <Button mode="contained" onPress={() => setToken('Get the token and save!')}>Submit</Button>
    </View>
  );
}

export function Home() {
const { setToken } = React.useContext(Auth)

  return (
    <View>
      <Text>Home</Text>
      <Button mode="contained" onPress={() => setToken(null)}>Signout</Button>
    </View>
  );
}

export default function App() {
  const [token, setToken] = React.useState(null);

  return (
    <Auth.Provider value={{token, setToken}}>
      <NavigationContainer>
        <Stack.Navigator>
          {!token ? (
            <Stack.Screen name="Login" component={Login} />
          ) : (
            <Stack.Screen name="Home" component={Home} />
          )}
        </Stack.Navigator>
      </NavigationContainer>
    </Auth.Provider>
  );
}

const styles = StyleSheet.create({
  container: {
    paddingTop: Constants.statusBarHeight + 20,
    padding: 20,
  },
  input: {
    marginBottom: 20,
  },
});

这是一个工作示例。

https://snack.expo.io/@raajnadar/react-navigation-auth-example https://snack.expo.io/@raajnadar/react-navigation-auth-example

注意 - 这是一个非常基本的设置,您必须对身份验证设置进行验证和正确的令牌检查,您不能依赖只有 2 个选项 true 或 false 的三元操作,您可能还具有像身份验证检查这样的中间状态。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

React Native 导航 5 身份验证流程 的相关文章

随机推荐

  • C++/CLI 中的 void* 到 Object^

    我正在致力于将大量 h 和 lib 文件从本机 C 包装到托管 C 以便最终用作 C 中引用的 dll 一些本机 C 函数的返回类型为 void 当我将值传回调用代码时 我不确定如何处理这个问题 例如 如果 C 应用程序调用我的 dll 包
  • Spring批处理文件归档

    我目前正在学习 Spring Batch 并且面临着文件归档任务的挑战 基本上我需要读取单独的 CSV 文件并将它们放入一个新的存档文件夹中 并在原始文件名后附加当前日期 我想知道的是如何从 multiResourceItemReader
  • TypeError:无法混合 BigInt 和其他类型,使用显式转换

    我正在尝试生成一个 20 位随机数 let code Math floor 10000000000000000000n Math random 90000000000000000000n 我尝试过将数字输入BigInt 以及添加一个n之后但
  • 办公室 可信地点

    我很好奇如何最好地处理这种情况 我有一本旧的 VBA 工作簿 可以正常工作 不幸的是 使用 Office 2007 2010 中的新安全措施 您会收到 安全警告某些活动内容已被禁用 消息 我知道我可以单击该消息并选择启用内容或将其添加到受信
  • 从 shape 转换为 topojson 时出现问题

    我正在尝试将墨西哥城市的 shapefile 转换为 topojson 并使用本教程使用 d3 js 显示它http bost ocks org mike map converting data http bost ocks org mik
  • 使用 Android.Xamarin 查找纬度和经度

    我正在尝试在 Android Xamarin 中开发商店定位器应用程序 我的第一步是找到我所在位置的纬度和经度 但我的模拟器 设备屏幕没有显示任何内容 我有我的uses permissions set to
  • JQuery UI 日期选择器的下一个和上一个按钮只有一个祖先。 $(e.target).parents() 只返回一个元素

    我还没有足够的代表来发布我自己的答案 但在我浪费更多人的时间之前 好吧 我现在明白为什么我没有得到所有预期的祖先 JQuery datepicker删除父节点 datepicker head 单击 在那之后我的事件是在按钮上触发的 已经被删
  • python 查找列表中最后一次出现的项目

    我希望找到序列 s 中项目 x 的最后一次出现 或者如果没有并且第一个项目的位置等于 0 则返回 None 这就是我目前所拥有的 def PositionLast x s count len s 1 for i in s count 1 i
  • Express 版本缺少“调试”->“异常”菜单

    我用 VS 2013快报 调试时 我需要在出现异常时自动停止 尝试遵循这个 http msdn microsoft com en us library d14azbfh aspx AddExceptionsCommand http msdn
  • 如何合并两个连续的行并形成一个新列?

    我有一个 DF 从会计软件收集 如下所示 Serial Date Particulars Price 1 0308 Andrew 100 2 NaN Gloves NaN 3 0408 Johnson 50 4 NaN Wicket NaN
  • 如何在 Windows 10 UWP 中根据 HTML 内容调整 Webview 高度?

    我目前正在开发 Windows 10 UWP 应用程序 并面临 WebView 的问题 即当我的 HTML 内容较少时 我的 JavaScript 高度会增加 我的代码如下 WebView webView new WebView IsHit
  • Django 模型中的密码字段

    我正在尝试创建一个可以存储其他应用程序的用户名和密码的模型 如何在 Django 中设置密码字段 使其在管理中不是纯文本 提前致谢 作为 mlissner建议 https stackoverflow com questions 371510
  • 如何使用 angular2 应用程序和 net core 应用程序实现 X-XSRF-TOKEN?

    我在 Startup cs 中设置了我的网络核心应用程序和防伪 middlweare services AddAntiforgery options gt options HeaderName X XSRF TOKEN 在Configure
  • onClick 不适用于 IE 11 中的单击

    当用户单击视频上的任意位置时 我尝试播放 暂停视频 问题是 它在 IE 11 中双击运行 而对于所有其他浏览器 它在单击左键时运行良好 以下是我的代码 var obj
  • 将键值数据库与 Spark 集成

    我无法理解 Spark 如何与存储交互 我想创建一个从 RocksDB 数据库 或任何其他键值存储 获取数据的 Spark 集群 然而 此时此刻 我能做的最好的事情就是将整个数据集从数据库获取到每个集群节点的内存中 例如映射到映射中 并从该
  • 优化填充“?”的正则表达式

    速记键盘上有以下按键STKPWHRAO EUFRPBLGTSDZ 用户按下多个键 然后抬起时一次性注册所有键 这类似于在钢琴上弹奏和弦 示例笔画是KAT TPHOEUGT 我有一个正则表达式来测试有效的速记和弦 可以是任意数量的这些键 但它
  • 防止选择日期范围内包含无效日期的日期范围

    我正在使用日期范围选择器来选择日期范围 一旦范围之间存在无效日期 就不应该将它们转移到另一个日期 类似的东西这个问题 https stackoverflow com a 46059134 8093805 但是它使用 Bootstrap da
  • 格式化 JavaScript 标签的正确方法是什么?

    自 1996 年以来一直在开发网络应用程序 我经常找到做旧事情的新方法 所以我想知道在新开发中使用正确的 JavaScript 标签是什么 目前我对 XHTML 使用类似的东西 我在某处读到这可能会导致旧版浏览器出现问题 但要使用以下内容
  • java.net.SocketTimeoutException:超时

    With OkHttp图书馆 应用程序面临以下SocketTimeoutException问题 如果请求大小较小 则可以正常工作 小于 1MB 我在 10 秒内收到此异常 甚至我的套接字超时 readTimeout 价值要高得多 请求始终失
  • React Native 导航 5 身份验证流程

    我似乎无法在我的 App js 文件上进行三元身份验证 我正在检查是否有密钥 然后根据该密钥的存在显示 AuthStack 或 MainStack 当我从 AuthStack 转到 MainStack 将密钥设置为 AsyncStorage