【问题标题】:Firebase onCompleteListener code being skippedFirebase onCompleteListener 代码被跳过
【发布时间】:2020-09-01 07:25:43
【问题描述】:

我正在制作一个登录用户可以创建另一个帐户的应用,因此在此代码中,另一个用户已经登录,检查 toast 以查看代码执行的顺序。

 btnCreateCompany.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

firebaseAuth.createUserWithEmailAndPassword(txtCompanyEmail.getText().toString(), txtCompanyPassword.getText().toString())
                            .addOnCompleteListener(new OnCompleteListener<AuthResult>() {
                                @Override
                                public void onComplete(@NonNull Task<AuthResult> task) {
                                    Toast.makeText(getApplicationContext(), "THIS TOAST IS COMING UP SECOND", Toast.LENGTH_SHORT).show();
                                    if (!task.isSuccessful())
                                        Toast.makeText(getApplicationContext(), "SOMETHING WENT WRONG", Toast.LENGTH_SHORT).show();
                                    else {
                                        Toast.makeText(getApplicationContext(), "THIS TOAST IS COMING UP THIRD", Toast.LENGTH_SHORT).show();
                                        FirebaseUser userCreated = task.getResult().getUser();
                                        userCreated.sendEmailVerification();
                                        userID = userCreated.getUid();//userID is a private field
                                    }
                                }
                            }); //After reaching the third toast the code adter onComplete doesn't execute anymore

                    if (userID == null)
                        Toast.makeText(getApplicationContext(), "THIS TOAST IS COMING UP FIRST", Toast.LENGTH_SHORT).show();
                    else {
                        companyRef = db.collection("companyData").document(userID); (...) }

【问题讨论】:

    标签: android firebase google-cloud-firestore firebase-authentication


    【解决方案1】:

    创建用户是一个异步操作。任何需要访问新创建用户的代码,都需要在 onComplete 方法中或从那里调用。

    比如:

    btnCreateCompany.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            firebaseAuth
                .createUserWithEmailAndPassword(txtCompanyEmail.getText().toString(), txtCompanyPassword.getText().toString())
                .addOnCompleteListener(new OnCompleteListener<AuthResult>() {
                    @Override
                    public void onComplete(@NonNull Task<AuthResult> task) {
                        Toast.makeText(getApplicationContext(), "THIS TOAST IS COMING UP SECOND", Toast.LENGTH_SHORT).show();
                        if (!task.isSuccessful()) }
                            Toast.makeText(getApplicationContext(), "SOMETHING WENT WRONG", Toast.LENGTH_SHORT).show();
                        }
                        else {
                            Toast.makeText(getApplicationContext(), "THIS TOAST IS COMING UP THIRD", Toast.LENGTH_SHORT).show();
                            FirebaseUser userCreated = task.getResult().getUser();
                            userCreated.sendEmailVerification();
                            userID = userCreated.getUid();//userID is a private field
                        }
                        if (userID == null) {
                            Toast.makeText(getApplicationContext(), "THIS TOAST IS COMING UP FIRST", Toast.LENGTH_SHORT).show();
                        }
                        else {
                            companyRef = db.collection("companyData").document(userID); (...) }
                        }
                });
    
    

    【讨论】:

      【解决方案2】:

      调用:

       task.getResult().getUser();
      

      可能无法正常工作。尝试在 task.isSuccessful() 中记录 firebaseauth.getCurrentUser() 和 task.getResult().getUser() 以更好地了解发生了什么。

      如果您无法调试,我可以建议不同的方法:

      1) 设置 Firebase Admin SDK 以从您的应用创建新用户: https://firebase.google.com/docs/auth/admin/manage-users#create_a_user

      2) 像这样使用 Node.Js 设置云功能:

      https://stackoverflow.com/a/43808854/13473423

      然后调用您的云函数以从您的应用创建新用户。在服务器端处理它意味着它不会干扰“当前”FirebaseUser,因此可以正常工作!

      查看这个关于如何在本地调用云函数的答案: https://firebase.google.com/docs/auth/admin/manage-users#create_a_user

      【讨论】:

        【解决方案3】:

        也许这行得通。所以尝试替换这一行

        FirebaseUser userCreated = task.getResult().getUser();
        

        用这个:

        FirebaseUser userCreated = firebaseauth.getCurrentUser();
        

        【讨论】:

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