【问题标题】:ReactNative i can't pass to another pageReact Native 我无法传递到另一个页面
【发布时间】:2020-10-30 17:12:53
【问题描述】:

我正在尝试使用 firebase.auth() 的 signInWithEmailAndPassword 功能创建登录页面 我可以创建用户,但我不能登录,我不明白为什么。

当我单击按钮 (touchableOpacity) 时,我应该转到进行登录的 signIn 函数并传递到另一个页面。但相反,它什么也没做,没有错误,但导航或错误电子邮件的错误都没有。

即使创建用户的功能有效并且我导航到同一页面,导航也已正确实现。

这是我的功能:

编辑:这是我的登录页面的完整代码

import getIdByEmail from './firebase/getIdByEmail';
import {IdContext} from './Context';


async function pushClient(email) {
  //I WANT TO PASS SIZE+1 TO ALL PAGES
  const size = await getID('Clients');
  const newID = (size + 1).toString();
  const docRef = firebase.firestore().collection('Clients').doc(newID);
  await docRef.set({
    Email: email
  });
  return (size+1);
}

async function getID(){ 
  const snapshot = await firebase.firestore().collection('Clients').get();
  return snapshot.size;
}

export default const LoginApp = props => {
    const [Email, setEmail] = useState();
    const [Pass, setPass] = useState();
    const [SignPress, setSignPress] = useState();
    const [CreatePress, setCreatePress] = useState();
    const [id, setId] = useContext(IdContext);

    const signIn = async(props) => {
        const ID = await getIdByEmail(Email);
          firebase.auth()
          .signInWithEmailAndPassword(Email, Pass)
          .then(() => {
              setId(ID);
              props.navigation.navigate('Skip'); 
          })
          .catch(error => {
              if (error.code === 'auth/email-already-in-use') {
              console.log('That email address is already in use!');
              }
  
              if (error.code === 'auth/invalid-email') {
              console.log('That email address is invalid!');
              }
              console.error(error);
          });
    }

    const createUser = () => {
        firebase.auth()
        .createUserWithEmailAndPassword(Email, Pass)
        .then(() => {
            pushClient(Email).then(id => {
              setId(id);
              props.navigation.navigate('ChooseRole');
            }); 
        })
        .catch(error => {
            if (error.code === 'auth/email-already-in-use') {
            console.log('That email address is already in use!');
            }

            if (error.code === 'auth/invalid-email') {
            console.log('That email address is invalid!');
            }

            console.error(error);
        });
    }

    return(
      <View>
          <Button title="Create User" onPress={() => setCreatePress(!CreatePress)}/>
            {CreatePress &&
              <View >
                <TextInput
                  style={styles.inputText}
                  placeholder="Email"
                  placeholderTextColor="#000000"
                  onChangeText={text => setEmail(text)}
                />
                <TextInput
                  style={styles.inputText}
                  placeholder="Password"
                  placeholderTextColor="#000000"
                  onChangeText={text => setPass(text)}
                />
                <TouchableOpacity
                    onPress={createUser} style={styles.loginBtn}>
                    <Text style={styles.buttonText}>continue</Text>
                </TouchableOpacity>
              </View> 
            }
          <Button title="Sign In with Email" onPress={() => setSignPress(!SignPress)}/>
            {SignPress &&
              <View>
                <TextInput
                  style={styles.inputText}
                  placeholder="Email"
                  placeholderTextColor="#000000"
                  onChangeText={text => setEmail(text)}
                />
                <TextInput
                  style={styles.inputText}
                  placeholder="Password"
                  placeholderTextColor="#000000"
                  onChangeText={text => setPass(text)}
                />
                <TouchableOpacity
                    onPress={signIn} style={styles.loginBtn}>
                    <Text style={styles.buttonText}>continue</Text>
                </TouchableOpacity>
              </View> 
            }
          <Text> Welcome</Text>
      </View>
  );
}

getIdByEmail.js

const getIdByEmail = email => {
    return new Promise((resolve, reject) => {
        db.collection('Clients').get().then(data => {
            data.docs.map(doc => {
                const d = doc.data();
                if (d.email === email) resolve(doc.id);
            });
        });
    });
}

编辑:我希望当用户单击按钮登录时,出现 inputText 以插入电子邮件和密码,然后他们单击“继续”,系统应计算文档的 ID(我在创建时分配帐户),其中有他们的电子邮件;之后,我想传递到另一个名为“Skip”的页面(相同的导航器)

【问题讨论】:

  • 您期望发生什么不同的事情?我们在这里看不到任何变量或文档数据,所以我们真的不知道 getIdByEmail 会发生什么。请编辑问题以包含足够的数据,以便任何人都可以重现该行为。
  • 我编辑它,让我知道现在是否更好

标签: reactjs firebase react-native google-cloud-firestore firebase-authentication


【解决方案1】:

我最好的猜测是文档中可能不存在电子邮件,并且您的承诺永远不会解决或拒绝,因此 ID 永远等待,firebase.auth() 永远不会运行。如果无法匹配到电子邮件,请尝试拒绝它。

//..getIdByEmail.js
const getIdByEmail = email => {
    return new Promise((resolve, reject) => {
        db.collection('Clients').get().then(data => {
            data.docs.map(doc => {
                const d = doc.data();
                if (d.email === email) resolve(doc.id);
            });
            reject("no email");
        });
    });
}



//..Login Page 
const signIn = async(props) => {
        const ID = await getIdByEmail(Email).catch(err=>{
             if(err=="no email"){
               console.log("no email")
             }else{
               console.err(e);
             }
        })

//.... }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-07
    • 1970-01-01
    • 1970-01-01
    • 2019-07-17
    • 1970-01-01
    相关资源
    最近更新 更多