android - 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 个错误
这是我的用户类代码
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)
}
}
}
解决方案
您导入了错误的数据类,这就是您看到错误的原因。转到顶部并更改导入器删除com.google.firebase.firestore.auth.user
并添加您的用户数据类
推荐阅读
- java - Spring Security:使端点控制器只能通过 Authorization: Bearer token header 访问
- python - 导入 python 模块之前设置的变量不被模块识别
- json - 是否直接在 postgres 上从 wal2json 执行 json?
- java - 为 maven 使用不同版本的 jar:一个用于 JDK 8,另一个用于 JDK 11
- javascript - React.Js 条件渲染:代码说明
- c++ - 在 EXPECT_CALL 中使用变量
- javascript - 在 React Router Dom 中检查身份验证
- c# - A* 寻路算法 INFINITE WHILE LOOP (c#)(unity)
- java - 将异步合成消息注入入站通道处理程序管道
- flutter - 如何在 build() 中处理简单数据处理