首页 > 解决方案 > Firebase - 谷歌登录活动,收到这些错误

问题描述

我正在使用 firebase 创建一个 google 登录活动,但在这些行中出现错误,请帮助。

这是登录活动代码

class SignInActivity : AppCompatActivity() {


lateinit var binding: ActivitySignInBinding

private lateinit var auth: FirebaseAuth

private lateinit var googleSignInClient: GoogleSignInClient


private val RC_SIGN_IN: Int = 123

private val TAG = "SignInActivity Tag"


override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    binding = ActivitySignInBinding.inflate(layoutInflater)
    setContentView(binding.root)


    // Configure Google Sign In
    val gso = GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
        .requestIdToken(getString(R.string.default_web_client_id))
        .requestEmail()
        .build()

    googleSignInClient = GoogleSignIn.getClient(this, gso)

    auth = FirebaseAuth.getInstance()

    binding.signInButton.setOnClickListener {
        signIn()
    }

}

// onStart 在 onCreate 之后调用,它的创建是为了 // 如果用户已经登录,他将直接借给主活动,否则 // 用户将保持登录活动

override fun onStart() {
    super.onStart()
    val currentUser = auth.currentUser
    updateUI(currentUser)
}


private fun signIn() {
    val signInIntent = googleSignInClient.signInIntent
    startActivityForResult(signInIntent, RC_SIGN_IN)
}



override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
    super.onActivityResult(requestCode, resultCode, data)

    if (requestCode == RC_SIGN_IN) {
        val task = GoogleSignIn.getSignedInAccountFromIntent(data)
        handleSignInResult(task)
    }
}

private fun handleSignInResult(completedTask: Task<GoogleSignInAccount>) {
    try {
        val account =
            completedTask.getResult(ApiException::class.java)!!
        Log.d(TAG, "firebaseAuthWithGoogle:" + account.id)
        firebaseAuthWithGoogle(account.idToken!!)
    } catch (e: ApiException) {
        Log.w(TAG, "signInResult:failed code=" + e.statusCode)

    }
}

private fun firebaseAuthWithGoogle(idToken: String) {
    val credential = GoogleAuthProvider.getCredential(idToken, null)
    binding.signInButton.visibility = View.GONE
    binding.progressBar.visibility = View.VISIBLE
 /* coroutines */   GlobalScope.launch(Dispatchers.IO) {
        val auth = auth.signInWithCredential(credential).await()
        val firebaseUser = auth.user
        withContext(Dispatchers.Main) {
            updateUI(firebaseUser)
        }
    }

}



private fun updateUI(firebaseUser: FirebaseUser?) {
    if(firebaseUser != null) {

        val user = User(firebaseUser.uid, firebaseUser.displayName, firebaseUser.photoUrl.toString())
        val usersDao = UserDao()
        usersDao.addUser(user)




        val mainActivityIntent = Intent(this, MainActivity::class.java)
        startActivity(mainActivityIntent)
        finish()
    } else {
        binding.signInButton.visibility = View.VISIBLE
        binding.progressBar.visibility = View.GONE
    }
}

}

在这些行中,我遇到了 4 个错误

看到这些错误

这是错误1的原因

这是错误 2 的原因

错误3原因

错误4原因

这是我的用户类代码

data class User ( val uid : String = "" ,
                  val displayName : String? = "",
                  val imageUrl : String = "" )

这是 userdao 类代码

class UserDao {

private val db = FirebaseFirestore.getInstance()
private val usersCollection = db.collection("users")

fun addUser(user: User?) {

    user?.let {

        /* global scope is a coroutine use for doing process in background thread*/

        GlobalScope.launch(Dispatchers.IO) {
        usersCollection.document(user.uid).set(it)
    }


    }

}

标签: androidandroid-studiokotlin

解决方案


您导入了错误的数据类,这就是您看到错误的原因。转到顶部并更改导入器删除com.google.firebase.firestore.auth.user 并添加您的用户数据类


推荐阅读