2

我使用 react-navigation v3 构建导航并使用 firebase 进行身份验证。没问题。导航流程有效,我可以注册。我面临的问题是,当我按下注册按钮时,它不会跳转到注册屏幕。

所以 Build: in App.js 的结构我正在做导航部分。首先发送包含登录的欢迎屏幕。

这是欢迎屏幕:

import React, { Component } from 'react'
import {StyleSheet, View } from "react-native";
import {Container, Text, Form, Content, Header, Button, Input, Label, Item} from 'native-base';
import SignUp from '../screens/register/SignUp'
import * as firebase from 'firebase';

const firebaseConfig = {
    apiKey: "example example",
    authDomain: "example example",
    databaseURL: "example example",
    projectId: "example example",
    storageBucket: "example example",
};
firebase.initializeApp(firebaseConfig);


export default class WelcomeScreen extends Component {
    constructor(props){
        super(props)

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

    loginUser = (email, password, navigate) => {
        try {
            firebase.auth().signInWithEmailAndPassword(email,password).then(function(user){
                console.log(user);
                navigate('Learn')
            })
        }
        catch (error) {
            console.log(error.toString())
        }
    };

    render() {
        return (
            <Container style={styles.container}>
                <Form>
                    <Item floatingLabel>
                        <Label>E-mail</Label>
                        <Input
                            autocorrect={false}
                            autoCapitalize={'none'}
                            onChangeText={(email) => this.setState({email})}
                        />
                    </Item>
                    <Item floatingLabel>
                        <Label>Password</Label>
                        <Input
                            secureTextEntry={true}
                            autocorrect={false}
                            autoCapitalize={'none'}
                            onChangeText={(password)=>this.setState({password})}
                        />
                    </Item>
                </Form>
                <Button style={{backgroundColor:'#6c5ce7', marginTop: 10}}
                    onPress={()=>this.loginUser(this.state.email,this.state.password)}
                    rounded
                    success
                >
                    <Text>Kelimeda'ya Uç</Text>
                </Button>
                <Button style={{backgroundColor:'#6c5ce7', marginTop: 10}}
                    onPress={()=>this.props.navigation.navigate('SignUp')}
                    rounded
                    primary
                >
                    <Text>Beni Kaydet!</Text>
                </Button>
            </Container>
        );
    }
}

注册屏幕:

import React, { Component } from 'react'
import {StyleSheet, View } from "react-native";
import {Container, Text, Form, Content, Header, Button, Input, Label, Item} from 'native-base';
import * as firebase from 'firebase';



export default class WelcomeScreen extends Component {
    constructor(props){
        super(props)

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

    signUpUser = (email, password) => {
        try {
            if(this.state.password.length < 6){
                alert('Lutfen 6 dan daha uzun bir karakter giriniz.')
                return
            }
            firebase.auth().createUserWithEmailAndPassword(email,password)
        }
        catch (error) {
            console.log(error.toString())
        }
    };

    render() {
        return (
            <Container style={styles.container}>
                <Form>
                    <Item floatingLabel>
                        <Label>E-mail</Label>
                        <Input
                            autocorrect={false}
                            autoCapitalize={'none'}
                            onChangeText={(email) => this.setState({email})}
                        />
                    </Item>
                    <Item floatingLabel>
                        <Label>Password</Label>
                        <Input
                            secureTextEntry={true}
                            autocorrect={false}
                            autoCapitalize={'none'}
                            onChangeText={(password)=>this.setState({password})}
                        />
                    </Item>
                </Form>
                <Button style={{backgroundColor:'#6c5ce7', marginTop: 10}}
                        onPress={()=>this.signUpUser(this.state.email,this.state.password)}
                        rounded
                        primary
                >
                    <Text>Beni Kaydet!</Text>
                </Button>
            </Container>
        );
    }
}


const styles = StyleSheet.create({
    container: {
        flex: 1,
        padding: 5,
        justifyContent: 'center',
        backgroundColor: '#fff',
    },
}); 

这是应用程序屏幕。我是否需要在此处检查用户是否已登录?还是欢迎屏幕?

//imports...

import React, { Component } from 'react';
import {View, StatusBar} from 'react-native';
import {
  createSwitchNavigator,
  createAppContainer,
  createDrawerNavigator,
  createBottomTabNavigator,
  createStackNavigator,} from 'react-navigation';
import Icon from 'react-native-vector-icons/Ionicons';
import WelcomeScreen from './src/screens/Welcome';
import Learn from './src/screens/Tab/Learn';
import Settings from './src/screens/Tab/Settings';
import Play from './src/screens/Tab/Play';


//content: const & functions and styles...

const DashboardTabNavigator = createBottomTabNavigator({
  Play,
  Learn,
  Settings
},
{
  navigationOptions: ({navigation}) => {
    const {routeName} = navigation.state.routes
        [navigation.state.index];
    return {
      headerTitle: routeName,
      headerTintColor:'#fff',
      headerStyle:{
        backgroundColor: '#2c3e50',
      }
    };
  }
});

const DashStack = createStackNavigator({
  DashboardTabNavigator: DashboardTabNavigator
}, {
  defaultNavigationOptions:({navigation}) =>{
    return {
      headerLeft: <Icon
          style={{paddingLeft: 15, color:'#fff'}}
          onPress={()=>navigation.openDrawer()}
          name={'md-menu'}
          size={30}
          />
    }
  },
});

const appDrawNavigator = createDrawerNavigator({
  Dashboard:{ screen: DashStack }
});

const appSwitchNavigation = createSwitchNavigator({
  Welcome:{ screen: WelcomeScreen },
  Dashboard:{ screen: appDrawNavigator }
});

const AppContainer = createAppContainer(appSwitchNavigation);


class App extends Component {
  render() {
    return(
        <View style={{flex: 1}}>
          <StatusBar
            backgroundColor="blue"
            barStyle="light-content"
         />
          <AppContainer/>
          </View>

    ) ;
  }
}
export default App;
4

2 回答 2

1

您的登录功能如下所示:

 loginUser = (email, password, navigate) => {
        try {
                firebase.auth().signInWithEmailAndPassword(email,password).then(function(user){
                console.log(user);
                navigate('Learn')
            })
        }
        catch (error) {
            console.log(error.toString())
        }
    };

此函数需要三个参数。您应该传递this.props.navigation.navigate给登录功能以使用 navigate('Learn')

<Button 
  style={{backgroundColor:'#6c5ce7', marginTop: 10}}
  onPress={()=>this.loginUser(this.state.email,this.state.password,this.props.navigation.navigate)}
  rounded
  success
 >
于 2019-01-01T16:54:28.620 回答
0

问题 1 的解决方案: 您尚未将导航传递给您的loginUser函数,因此它不起作用。请将导航参数发送给loginUser这样的人。

<Button
   style={{backgroundColor:'#6c5ce7', marginTop: 10}}
   onPress={()=>this.loginUser(this.state.email,this.state.password, this.props.navigation.navigate)}
   rounded
   success>

问题2的解决方案: 对于firebase重复问题,这是因为您在应用程序中初始化了firebase实例两次。相反,您应该做的是,只需在应用程序根组件(如App.js启动画面)初始化 firebase,以便它可以在整个应用程序生命周期中可用,并且只要您需要使用它,只需导入并使用它。

问题 3 的解决方案:这是一个常见的用例,即预先知道用户的登录状态以将用户适当地导航到应用程序中。为此,您可以做的是,只需保存一个标志,AsyncStorage例如。isLoggedInYES成功登录并发布此内容一样,每当打开应用程序时,只需使用标志的存在/值分析用户是否登录。执行此操作的好地方是应用程序的 Splashscreen 组件或应用程序的根组件。

编辑后的答案(附加):(对于问题 1)

您的导航路线嵌套错误,直接跳转到从欢迎屏幕学习,从一个屏幕导航到另一个屏幕,两个屏幕应该在相同的导航范围内(如果导航器在另一个导航器中作为路线给出,则考虑路线导航器作为一个屏幕,当用户导航到它时,用户将被导航到它的初始路线)

您的代码应该以导航到Dashboard路由为目标,这将在内部呈现嵌套的导航器,即第一个/初始路由,但在当前嵌套的情况下,这将使您进入,Play所以可以做的是,制作Learn as first/initial route您的选项卡导航器。

中的代码loginUser应该是navigate('Dashboard')并且您的选项卡导航器应该Learn作为其初始路线。

于 2019-01-01T15:17:26.057 回答