类型不匹配错误求助:推断类型为View!但期望为String
问题分析与解决
错误提示「Type mismatch: inferred type is View! but String was expected」的原因很明确:你把点击事件的View参数命名成了otp,然后直接把这个View对象传给了需要String类型验证码的PhoneAuthProvider.getCredential方法,导致类型不匹配。
错误代码问题点
在setOnClickListener { otp -> }里,lambda的参数otp其实是被点击的View本身(也就是你的otpView),不是输入的验证码字符串。
修复后的代码示例
binding!!.otpView.setOnClickListener { // 获取OTP输入框中的验证码字符串,根据你的OTPView实现调整获取方式 val otpCode = binding.otpView.text.toString() // 如果是自定义OTPView,有些库会直接提供获取验证码的方法,比如: // val otpCode = binding.otpView.otp val credential = PhoneAuthProvider.getCredential(verificationId!!, otpCode) auth!!.signInWithCredential(credential).addOnCompleteListener { task -> if (task.isSuccessful) { val intent = Intent(this@OTPActivity, SetupProfileActivity::class.java) startActivity(intent) finishAffinity() } else { Toast.makeText(this@OTPActivity, "Failed", Toast.LENGTH_SHORT).show() } } }
关键说明
- 点击事件的lambda参数不需要命名成
otp,直接忽略或者命名为view更清晰。 - 必须从
otpView中提取输入的字符串验证码,再传给getCredential方法。不同的OTPView库获取验证码的方式可能不同,比如有的是text属性,有的是专门的getOtp()方法,根据你使用的库调整即可。
内容的提问来源于stack exchange,提问作者tamir yosef
相关产品推荐
相关产品推荐

