Kotlin同一Activity中如何将showAuth函数的值传递给setup函数
问题根因
setup()函数定义要求必须传入email和provider两个参数,但你在onCreate生命周期中调用时,用户还未完成注册操作,这两个值还未生成,因此会报参数缺失错误。- 你将按钮点击事件绑定逻辑和注册成功后的业务逻辑耦合在了一起,同时在
showAuth()中重复调用setup()会导致按钮重复绑定点击监听,后续点击会触发多次重复注册请求。 - 原有代码还存在笔误:
inputEmail.text.text.oString()为错误写法,需要修正。
修复方案
1. 修改setup函数
移除setup的入参,setup的作用仅为在页面初始化时给注册按钮绑定点击事件,不需要提前接收email和provider参数,这两个值会在注册成功的回调中直接获取:
private fun setup(){ iniciarSesionButton.setOnClickListener{ if (inputEmail.text.isNotEmpty() && inputContraseña.text.isNotEmpty()){ FirebaseAuth.getInstance().createUserWithEmailAndPassword(inputEmail.text.toString(), inputContraseña.text.toString()) .addOnCompleteListener { if(it.isSuccessful){ // 注册成功后直接获取所需的两个值 val email = it.result?.user?.email ?: "" val provider = ProviderType.Email // 执行数据库写入逻辑 val db = FirebaseFirestore.getInstance() db.collection("users").document(email).set( hashMapOf("provider" to provider, "username" to inputUsername.text.toString()) ) // 传入两个值调用showAuth跳转 showAuth(email, provider) } else{ showError() } } } } }
2. 修改showAuth函数
移除showAuth中对setup的调用,showAuth仅负责封装跳转逻辑即可,重复调用setup会导致按钮监听多次绑定:
private fun showAuth(email: String, provider: ProviderType){ val authIntent = Intent(this, AuthActivity::class.java).apply { putExtra("email",email) putExtra("provider",provider.name) } startActivity(authIntent) }
3. 保留onCreate中的调用
原有onCreate里的setup()调用无需修改,现在已经是无参调用,不会再报参数缺失错误。
内容的提问来源于stack exchange,提问作者Juan Sanchez
相关产品推荐
相关产品推荐

