React Native - 将登录的 Firebase 用户重定向到 Home 组件

2023-11-27

我的目标是将用户重定向到Home如果用户已经登录,则组件。我可以登录用户并将其重定向到Home除非_logInUser()叫做。然而,一旦重定向到Home组件,如果我刷新模拟器,应用程序将返回到Login成分。

我尝试使用来解决这个问题componentWillMount()和设置let user = firebaseApp.auth().currentUser。然而,我什至记录了user到控制台,但似乎if检查直接转到else陈述。我将不胜感激任何见解!

这是我的代码(我正在使用react-native-router-flux用于路由):

索引.ios.js

import React, { Component } from 'react';
import { Scene, Router } from 'react-native-router-flux';
import {
  AppRegistry,
} from 'react-native';

// Components
import Login from './components/user/login/login';
import Home from './components/user/home/home';

class AppName extends Component {
  render() {
    return (
      <Router>
        <Scene key="root">
          <Scene key="login" component={Login} title="Login" hideNavBar={true} initial={true}/>
          <Scene key="home" component={Home} title="Home"/>
        </Scene>
      </Router>
    );
  }
}


AppRegistry.registerComponent('AppName', () => AppName);

login.js

import React, { Component } from 'react';
import {
  AlertIOS,
  Dimensions,
  Image,
  ScrollView,
  StyleSheet,
  Text,
  TextInput,
  TouchableOpacity,
  View
} from 'react-native';

import { KeyboardAwareScrollView } from 'react-native-keyboard-aware-scroll-view';
import { Actions } from 'react-native-router-flux';

import firebaseApp from 'AppName/firebase_setup';

// Set width and height to screen dimensions
const { width, height } = Dimensions.get("window"); 

// For Firebase Auth
const auth = firebaseApp.auth();

// Removed styles for StackOverflow

export default class Login extends Component {
  constructor(props) {
    super(props);

    this.state = {
      email: '',
      password: ''
    }
  }

  componentWillMount() {
    let user = auth.currentUser;
    if (user != null) {
      console.log(user);
      Actions.home
    } else {
      return;
    }
  }

  render() {
    return (
      <View style={styles.mainContainer}>
        <KeyboardAwareScrollView 
          style={styles.scrollView}
          keyboardShouldPersistTaps={false}
          automaticallyAdjustContentInsets={true}
          alwaysBonceVertical={false}
        >
          <View style={styles.loginContainer}>

            <View style={styles.inputContainer}>

              <TextInput
                style={styles.formInput}
                placeholder="Email"
                keyboardType="email-address"
                autoFocus={true}
                autoCorrect={false}
                autoCapitalize="none"
                onChangeText={(email) => this.setState({email})}
              />

              <TextInput
                style={styles.formInput}
                secureTextEntry={true}
                placeholder="Password"
                autoCorrect={false}
                autoCapitalize="none"
                onChangeText={(password) => this.setState({password})}
              />

              <TouchableOpacity 
                style={styles.loginButton}
                onPress={this._logInUser.bind(this)}
              >
                <Text style={styles.loginButtonText}>Log In</Text>
              </TouchableOpacity>

              <TouchableOpacity>
                <Text style={styles.toSignupButton}>Dont have an account? Create one!</Text>
              </TouchableOpacity>

            </View>
          </View>

          <View style={styles.footer}>
            <Text style={styles.footerText}>
              By signing up, I agree to TextbookSwap's <Text style={styles.footerActionText}>Terms of Service</Text> and <Text style={styles.footerActionText}>Privacy Policy</Text>.
            </Text>
          </View>
        </KeyboardAwareScrollView>
      </View>
    );
  }

  _logInUser() {
    let email = this.state.email;
    let password = this.state.password;

    auth.signInWithEmailAndPassword(email, password)
      .then(Actions.home)
      .catch((error) => {
        AlertIOS.alert(
          `${error.code}`,
          `${error.message}`
        );
      });
  }
}

首先,在您的登录组件中,您正在以同步方式检查 currentUser,但它可能在 componentWillMount 上尚不可用。您应该异步进入:

firebase.auth().onAuthStateChanged(function(user) {
  if (user) {
    // User is signed in.
  } else {
    // No user is signed in.
  }
});

最有可能的是打电话就足够了Actions.home()如果用户已登录。但是,随着您的应用程序的增长,您可能希望将此逻辑从登录屏幕向上移动。正如凯尔建议的,您可以使用切换功能。它通常(引用文档)与 redux 一起使用,如下所示:

const RootSwitch = connect(state => ({loggedIn: state.transient.loggedIn}))(Switch);
const rootSelector = props => props.loggedIn ? 'workScreens' : 'authScreens';

const scenes = Actions.create(
   <Scene key="root" tabs={true} component={RootSwitch} selector={rootSelector}>
     <Scene key="authScreens" hideNavBar={true}>
       <Scene key="login" component={Login} initial={true}/>
       <Scene key="register" component={Register} />
       ...
     </Scene>
     <Scene key="workScreens">
       <Scene key="home" component={Home} initial={true}/>
       <Scene key="profile" component={ProfileMain}/>
       ...
     </Scene>
   </Scene>
);

如果你不想使用redux,你可以手动包装Switch,而不是使用react-redux的connect并将loggedIn属性传递给Switch。例如,您可以在此包装器中监听 firebase onAuthStateChanged,如下所示:

class FirebaseSwitch extends Component {

  state = {
    loggenIn: false
  }

  componentWillMount() {
    firebase.auth().onAuthStateChanged( user =>
      this.setState({loggedIn: !!user})
    );
  }

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

React Native - 将登录的 Firebase 用户重定向到 Home 组件 的相关文章

  • jQuery .push 到 .get 调用中的数组给出空结果

    谁能告诉我为什么下面给我一个空字符串 当我console log contentArray in the get 回调函数它显示数据 但是当我尝试在下面的代码中执行它时 结果为空 sectionArray contentArray func
  • 在版本 4.4.6 中禁用 ckeditor 上下文菜单

    我在 Rails4 项目中使用 ckeditor 我尝试了 ckeditor gem 和 ckeditor rails gem 来提供 ckeditor 库 这里有多个帖子 人们希望删除 ckeditor 上下文菜单 以便可以显示本机浏览器
  • Animated.Event 在 React Native 中如何工作?

    我理解正确吗 这两套代码的意思是一样的吗 在性能或者可靠性上有什么区别吗
  • Number.IsNaN() 比 isNaN() 更糟糕吗

    Soooooo isNaNJavaScript 显然被破坏了 比如 isNaN isNaN isNaN true isNaN false isNaN 0 返回 false 当它们看起来都是 不是数字 在 ECMAScript 6 中 草案包
  • 想要动态处理与分页相关的页码显示:ReactJS

    我有一些分页逻辑工作得很好 唯一的问题是我只能让它显示并固定数量的页面可供选择 现在我已经把它放到了 5 页 但我希望它能够根据总记录动态更改 假设我有 100 条记录 每页限制为 10 条 将有 10 页 现在我只能让它以这种方式显示 第
  • 本地推送通知到在应用程序内运行 JS 代码的 Win8 Live Tile

    我正在尝试将更新发送到我的应用程序的磁贴 当应用程序运行时 这可以正常工作 例如 当用户单击按钮时 我可以轻松地将磁贴更新通知发送到磁贴 我无法解决的是当应用程序无法运行时如何更新磁贴 我找到的唯一选择是使用以下命令从远程 Web 服务器拉
  • 按下回车键时不刷新页面

    我遇到了一些问题 只要表单中有输入 回车键就会触发页面刷新 下面的代码 如果按下回车并且文本区域 input 中没有输入任何文本 则不会刷新页面 但是如果按下回车并且 input中有输入或者光标位于文本区域 我不确定是什么触发了它 因为 s
  • React autoFocus 将光标设置为输入值的开头

    我有一个受控输入 最初显示一个值 我已将该输入设置为自动聚焦 但当我希望它出现在末尾时 光标出现在输入的开头 我知道这可能是因为自动对焦是在值之前添加的 但我不能 100 确定 在输入字段末尾完成光标初始化的最佳方法是什么 var Test
  • JavaScript 中的 Promise 有什么意义?

    一个承诺是一个 可能现在可用 或将来可用 或永远不可用的值 来源 MDN 假设我有一个想要处理图片的应用程序 图片已加载 例如在算法在后台使用它之后 或某种其他类型的延迟 现在我想检查一下图片是否可以在future 通过使用承诺 而不是回调
  • 如何在 Android 模块中使用 FirebaseAuth

    我正在开发一个聊天库 我想在其中显示登录用户的对话 制作该库的原因是我想将其集成到多个项目中 我现在面临的问题是FirebaseAuth表示用户尚未登录 FirebaseAuth getInstance mFirebaseApp getCu
  • Firebase 身份验证问题 - 通过电子邮件地址检查用户是否存在

    我在 Firebase 上创建了一个帐户 它有效 但现在我想阻止人们使用已存在的电子邮件地址创建帐户 这是代码 DatabaseManager shared userExists with email completion weak sel
  • 使用 JavaScript 移动页面上的按钮

    我的按钮可以移动 但奇怪的是 我无法弄清楚偏移是否有问题 我希望我的按钮随着鼠标光标移动 但现在它的移动方式不是我想要的 有时它会消失 另外 创建的新按钮是重叠的 我不知道如何解决这个问题并拥有更好的外观 var coorA var coo
  • 在 React Native 中调试应用程序崩溃

    我是 React Native 新手 我正在尝试安装 React Native Facebook SDK 以便我可以使用我的应用程序进行 Facebook 登录 我按照此处列出的步骤操作 https tylermcginnis com in
  • 表单发布请求并存储收到的数据

    我有一个非常简单的表单 在提交时发出发布请求
  • 如何从浏览器向服务器发送“页面将关闭”消息?

    我想向每个 html 文档添加一个脚本 JavaScript 该脚本向服务器发送两条消息 页面确实打开了 页面将关闭 此消息包含页面打开的时间 打开消息应在文档加载时 或加载完成时 发送 这是简单的部分 The close message
  • 使用javascript动态更新css内容

    需要将 css 更新为动态值 我不确定最好的方法是什么 div style zoom 1 div 缩放级别将根据窗口大小调整触发 应用程序将相应缩放 我将此应用程序加载到 cordova 中并让它在 iPAD 中运行 然后我意识到需要使用
  • Rails 3.1+ 的 Jasmine 与 Mocha JavaScript 测试 [已关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我对茉莉花有经验并且非常喜欢它 有谁有 Jasmine 和 Mocha 的经验 特别是 Rails 的经验吗 我想知道是否值得转用 我已经在 J
  • 主页(网格)上的缩略图现在显得模糊。如何纠正?

    我不知道这看起来是否愚蠢 但从早上开始我就无法纠正这个突然出现在我的博客网站上的错误www candidopinions in http www candidopinions in 我有一个网格视图模板 其中博客文章中的特色图像作为调整大小
  • 将数组从 jquery ajax 传递到代码后面

    我必须将二维数组传递给在asp net网页代码后面编写的页面方法我有一个变量objList作为二维数组 我使用以下代码来实现此目的 但没有成功 并且未调用页面方法 脚本语言 function BindTable objList ajax u
  • 如何通过索引访问 JSON 对象中的字段

    我知道这不是最好的方法 但我别无选择 我必须通过索引访问 JSONObject 中的项目 访问对象的标准方法是只写this objectName or this objectName 我还找到了一种获取 json 对象内所有字段的方法 fo

随机推荐

  • jersey + grizzly + hk2:依赖注入,但不注入资源

    跟进Jersey HK2 Grizzly 注入EntityManager的正确方法 我想了解如何在类中使用依赖注入不是球衣资源 例如 我可能在 ExecutorService 中运行后台任务 并且它们可能需要 EntityManager 如
  • SSL:将数据加载到seaborn时出现CERTIFICATE_VERIFY_FAILED错误?

    我正在尝试从 github 页面加载数据 它是您可以获得的标准 seaborn 数据集的一部分 我使用 PyCharm 但我不明白到底发生了什么 import seaborn as sns data sns load dataset tip
  • 使用 NamedParameterJDBCTemplate 进行插入时出现“无效的列类型”异常

    我在向数据库插入一行时使用下面的代码 oracle 10g xe jar ojdbc14 jar String sql INSERT INTO SPONSOR TB ID NAME INDUSTRY TYPE IS REPORTING SP
  • python gnupg.encrypt:没有错误,但不加密数据或文件

    在 Windows 7 上使用 python gnupg v0 3 5 w Python 2 7 和 GPG4Win v2 2 0 test gnupg py 导致 2 次失败 测试搜索密钥是否有效 失败 文档测试 gnupg GPG re
  • 为什么单个修订版的 SVN 转储比完整转储大?

    我的存储库是2 5G 通过转储svnadmin dump myrepos gt dumpfile是5G 但是当我像这样转储时svnadmin dump myrepos r 23785 gt rev 23785 dumpfile其中 2378
  • 边框图像如何与线性渐变一起使用?

    我试图了解 border image slice 在渐变边框图像的情况下如何工作 在规范中 边框图像切片的值可以是一个数字 表示光栅图像的边缘偏移 以像素为单位 和矢量图像的坐标 对于矢量图像 该数字与元素的大小有关 而不是与源图像的大小有
  • Python中的反平方根[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心以获得指导 是否有任何 Python
  • 如何在 .NET 中创建子集字体?

    我有一个 Silverlight 应用程序 需要在其中嵌入一些不太常见的字体 这对我来说非常简单 只需复制 TTF OTF 并使用我的应用程序进行编译即可 然而 在很多情况下 实际只使用了 5 10 个字符 在其他情况下 某些字体文件非常大
  • 将 Hibernate 升级到 5.1.0 后如何导出架构?

    我最近将 Hibernate 从 5 0 更新到 5 1SchemaExportAPI 已更改 迁移文档提到了这一更改 但没有解释如何使用较新的 API 此外 我还没有找到任何其他支持示例来修复重大更改 我偶然发现了这个代码差异 它帮助我解
  • 删除用作外键的对象

    我有下一个型号 class Target models Model name models CharField max length 100 blank False class SubTarget models Model target m
  • MVC JSON 操作返回 bool

    我的 ASP NET MVC 操作是这样写的 GET TaxStatements CalculateTax prettyId public ActionResult CalculateTax int prettyId if prettyId
  • 检测winforms中的箭头键[重复]

    这个问题在这里已经有答案了 可能的重复 上 下 左 右方向键不触发 KeyDown 事件 先看代码 using System using System Collections Generic using System ComponentMo
  • 通过 Composer 安装 Laravel 时获取建议

    从昨天开始 当我通过以下方式创建 laravel 项目时 composer create project prefer dist laravel laravel project name 我收到这些建议消息 这是正常现象还是我搞砸了什么 我
  • 如何指定实际的 x 轴值以在 R 中绘制为 x 轴刻度

    我正在 R 中创建一个绘图 但我不喜欢 R 绘制的 x 轴值 例如 x lt seq 10 200 10 y lt runif x plot x y 这将绘制一个在 X 轴上具有以下值的图表 50 100 150 200 但是 我想绘制 2
  • MySQL - IN() 中的 ORDER BY 值

    我希望对以下查询中返回的项目进行排序它们输入 IN 函数的顺序 INPUT SELECT id name FROM mytable WHERE name IN B A D E C OUTPUT id name 5 B 6 B 1 D 15
  • 如何将流程图转化为实施? [关闭]

    Closed 这个问题需要多问focused 目前不接受答案 编辑 简介 为了吸引更广泛的读者 我通过一个复杂的 有点乏味的 现实生活中的例子重新阐述了我最初的问题 原始问题如下 远 所示 Tom 刚刚被 Acme Inc 聘为初级软件工程
  • 如何使用 c# 使用 httpwebrequest 从 json api 获取数据?

    我想从中获取所有变量https api coinmarketcap com v1 ticker 在我的 C 控制台应用程序中 我怎样才能做到这一点 我首先将整个页面作为流获取 现在做什么 private static void start
  • Swift 错误:对泛型类型 Dictionary 的引用需要 <...> 中的参数

    错误Reference to generic type Dictionary requires arguments in lt gt 出现在函数的第一行 我试图让该函数返回从 api 检索到的 NSDictionary 有人知道这里会发生什
  • Java 等待线程列表

    有没有办法获取对象上的等待线程列表 等待线程数 如果您正在使用synchronized关键字 没有 但如果您正在使用java util concurrent锁 你可以 ReentrantLock有一个受保护的方法getWaitingThre
  • React Native - 将登录的 Firebase 用户重定向到 Home 组件

    我的目标是将用户重定向到Home如果用户已经登录 则组件 我可以登录用户并将其重定向到Home除非 logInUser 叫做 然而 一旦重定向到Home组件 如果我刷新模拟器 应用程序将返回到Login成分 我尝试使用来解决这个问题comp