Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/424.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript React本机firebase身份验证处理_Javascript_Reactjs_React Native_Firebase Authentication_Expo - Fatal编程技术网

Javascript React本机firebase身份验证处理

Javascript React本机firebase身份验证处理,javascript,reactjs,react-native,firebase-authentication,expo,Javascript,Reactjs,React Native,Firebase Authentication,Expo,我正在尝试在我的Expo应用程序中创建一个简单的身份验证流 现在在我的应用程序中发生的事情是,我可以使用Firebase身份验证注册用户,但无法导航到经过身份验证的流。单击“注册”后不会发生任何事情,但我可以在firebase中看到用户 我一直在阅读React Navigaion文档,并尝试实现类似于他们为there所做的事情,但没有取得任何成功 我认为这个问题与我如何在App.js中获得令牌以及我对useEffect的使用有关 App.js import React, { useEffect

我正在尝试在我的Expo应用程序中创建一个简单的身份验证流

现在在我的应用程序中发生的事情是,我可以使用Firebase身份验证注册用户,但无法导航到经过身份验证的流。单击“注册”后不会发生任何事情,但我可以在firebase中看到用户

我一直在阅读React Navigaion文档,并尝试实现类似于他们为there所做的事情,但没有取得任何成功

我认为这个问题与我如何在App.js中获得令牌以及我对useEffect的使用有关

App.js

import React, { useEffect } from 'react';
import * as eva from '@eva-design/eva';
import { Provider as AuthProvider } from './src/context/AuthContext';
import { createDrawerNavigator } from '@react-navigation/drawer';
import { createStackNavigator } from '@react-navigation/stack';
import { ApplicationProvider } from '@ui-kitten/components';
import { NavigationContainer } from '@react-navigation/native';
import LandingScreen from './src/screens/LandingScreen';
import RegisterScreen from './src/screens/RegisterScreen';
import LoginScreen from './src/screens/LoginScreen';
import HomeScreen from './src/screens/HomeScreen';
import DetailScreen from './src/screens/DetailScreen';

const Drawer = createDrawerNavigator();
const Stack = createStackNavigator();

/*eslint-disable */
export default function App() {
  let token;
  useEffect(() => {
    // Fetch the token from storage then navigate to our appropriate place
    const localSignin = async () => {
      try {
        token = await AsyncStorage.getItem('userToken');
      } catch (e) {
        // Restoring token failed
      }
    };
    console.log(token);
    localSignin();
  }, []);

  return (
    <ApplicationProvider {...eva} theme={eva.light}>
      <AuthProvider>
        <NavigationContainer>
          {token ? (
            <>
              <Drawer.Navigator initialRouteName="Home">
                <Drawer.Screen name="Home" component={HomeScreen} />
                <Drawer.Screen name="Details" component={DetailScreen} />
              </Drawer.Navigator>
            </>
          ) : (
            <>
              <Stack.Navigator>
                <Stack.Screen name="Landing" component={LandingScreen} />
                <Stack.Screen name="Register" component={RegisterScreen} />
                <Stack.Screen name="Login" component={LoginScreen} />
              </Stack.Navigator>
            </>
          )}
        </NavigationContainer>
      </AuthProvider>
    </ApplicationProvider>
  );
}
import React,{useffect}来自“React”;
从“@eva design/eva”导入*作为eva;
从“./src/context/AuthContext”导入{Provider as AuthProvider};
从'@react导航/drawer'导入{createDrawerNavigator};
从'@react navigation/stack'导入{createStackNavigator};
从“@ui kitten/components”导入{ApplicationProvider};
从'@react-navigation/native'导入{NavigationContainer};
从“/src/screens/LandingScreen”导入着陆屏幕;
从“/src/screens/RegisterScreen”导入注册表屏幕;
从“/src/screens/LoginScreen”导入LoginScreen;
从“./src/screens/HomeScreen”导入主屏幕;
从“./src/screens/DetailScreen”导入DetailScreen;
const Drawer=createDrawerNavigator();
const Stack=createStackNavigator();
/*eslint禁用*/
导出默认函数App(){
让代币;
useffect(()=>{
//从存储器中取出令牌,然后导航到适当的位置
const localSignin=async()=>{
试一试{
token=等待AsyncStorage.getItem('userToken');
}捕获(e){
//还原令牌失败
}
};
console.log(令牌);
localSignin();
}, []);
返回(
{代币(
) : (
)}
);
}
我应该在这里的某个地方使用AuthContext吗?我对react开发非常陌生,因此如果这有点不清楚,我很抱歉。

您的“令牌”是异步操作的,因此它应该是一个状态变量,以便您的组件在更改时可以重新呈现。要实现这一点,您应该将您的令牌声明替换为

const [token, setToken] = React.useState(undefined);
之后,当您想要更改令牌时,不要重新分配给令牌变量,而是使用所需的值调用setToken。像这样:

setToken(await AsyncStorage.getItem('userToken'));
最后的代码应该是这样的

import React, { useEffect } from 'react';
import * as eva from '@eva-design/eva';
import { Provider as AuthProvider } from './src/context/AuthContext';
import { createDrawerNavigator } from '@react-navigation/drawer';
import { createStackNavigator } from '@react-navigation/stack';
import { ApplicationProvider } from '@ui-kitten/components';
import { NavigationContainer } from '@react-navigation/native';
import LandingScreen from './src/screens/LandingScreen';
import RegisterScreen from './src/screens/RegisterScreen';
import LoginScreen from './src/screens/LoginScreen';
import HomeScreen from './src/screens/HomeScreen';
import DetailScreen from './src/screens/DetailScreen';

const Drawer = createDrawerNavigator();
const Stack = createStackNavigator();

/*eslint-disable */
export default function App() {
  const [token, setToken] = React.useState(undefined);
  useEffect(() => {
    // Fetch the token from storage then navigate to our appropriate place
    const localSignin = async () => {
      try {
        setToken(await AsyncStorage.getItem('userToken'));
      } catch (e) {
        // Restoring token failed
      }
    };
    console.log(token);
    localSignin();
  }, []);

  return (
    <ApplicationProvider {...eva} theme={eva.light}>
      <AuthProvider>
        <NavigationContainer>
          {token ? (
            <>
              <Drawer.Navigator initialRouteName="Home">
                <Drawer.Screen name="Home" component={HomeScreen} />
                <Drawer.Screen name="Details" component={DetailScreen} />
              </Drawer.Navigator>
            </>
          ) : (
            <>
              <Stack.Navigator>
                <Stack.Screen name="Landing" component={LandingScreen} />
                <Stack.Screen name="Register" component={RegisterScreen} />
                <Stack.Screen name="Login" component={LoginScreen} />
              </Stack.Navigator>
            </>
          )}
        </NavigationContainer>
      </AuthProvider>
    </ApplicationProvider>
  );
}
import React,{useffect}来自“React”;
从“@eva design/eva”导入*作为eva;
从“./src/context/AuthContext”导入{Provider as AuthProvider};
从'@react导航/drawer'导入{createDrawerNavigator};
从'@react navigation/stack'导入{createStackNavigator};
从“@ui kitten/components”导入{ApplicationProvider};
从'@react-navigation/native'导入{NavigationContainer};
从“/src/screens/LandingScreen”导入着陆屏幕;
从“/src/screens/RegisterScreen”导入注册表屏幕;
从“/src/screens/LoginScreen”导入LoginScreen;
从“./src/screens/HomeScreen”导入主屏幕;
从“./src/screens/DetailScreen”导入DetailScreen;
const Drawer=createDrawerNavigator();
const Stack=createStackNavigator();
/*eslint禁用*/
导出默认函数App(){
const[token,setToken]=React.useState(未定义);
useffect(()=>{
//从存储器中取出令牌,然后导航到适当的位置
const localSignin=async()=>{
试一试{
setToken(wait AsyncStorage.getItem('userToken');
}捕获(e){
//还原令牌失败
}
};
console.log(令牌);
localSignin();
}, []);
返回(
{代币(
) : (
)}
);
}

感谢您的回复。这没什么用。你有没有碰巧看到这个项目的链接?我把令牌作为AuthContext.js的一部分,不知道我是否应该在那里使用令牌,而不是您在这里提到的方式?此处使用效果中的console.log将令牌显示为未定义。而Im措辞如果我在此处使用该AuthContext您的AuthContext,则您正在存储response.user.getIdToken()的值。该方法返回一个承诺,然后您应该“等待”它。我将在完成调试后编辑答案关于在App.js中使用AuthContext,以实现您可以将AuthContext用作ContextConsumer,或将App.js拆分为两个组件(您不能在应用程序中使用useContext钩子,因为它没有被您的提供商包围)哈哈,好吧,我需要更多的阅读,因为我不知道你把App.js分成两个组件是什么意思。对我来说,这似乎是更好的处理方式?