如何解决Kotlin中与作用域相关的Unresolved reference: text错误
问题原因
setOnClickListener传入的lambda默认参数it是View类型,View类本身没有text属性,只有TextView及其子类(比如你使用的Button)才存在text属性,所以直接调用it.text会报未找到引用的错误。
你之前直接写btnDivide.text可以正常运行,是因为btnDivide本身就是明确的Button实例,编译期就能识别到它的text属性。
可行的实现方案
方案1:强转类型后调用
直接将it强转为Button类型即可访问text属性,适合当前所有点击回调都绑定到按钮的场景:
// Operators - setOnClickListener btnDivide.setOnClickListener { viewModel.mountOperator((it as Button).text) } btnMultiply.setOnClickListener { viewModel.mountOperator((it as Button).text) } btnMinus.setOnClickListener { viewModel.mountOperator((it as Button).text) } btnPlus.setOnClickListener { viewModel.mountOperator((it as Button).text) }
方案2:显式指定lambda参数类型
在声明lambda时直接指定参数为Button类型,编译期会做类型校验,比隐式强转更安全:
// Operators - setOnClickListener btnDivide.setOnClickListener { view: Button -> viewModel.mountOperator(view.text) } btnMultiply.setOnClickListener { view: Button -> viewModel.mountOperator(view.text) } btnMinus.setOnClickListener { view: Button -> viewModel.mountOperator(view.text) } btnPlus.setOnClickListener { view: Button -> viewModel.mountOperator(view.text) }
方案3:封装扩展函数简化重复代码
如果项目中有大量类似的按钮点击场景,可以封装Button专属的点击扩展函数,后续调用不需要每次处理类型:
首先定义扩展函数:
fun Button.onClick(block: (Button) -> Unit) { setOnClickListener { block(it as Button) } }
之后调用就可以直接使用你预期的写法:
// Operators - setOnClickListener btnDivide.onClick { viewModel.mountOperator(it.text) } btnMultiply.onClick { viewModel.mountOperator(it.text) } btnMinus.onClick { viewModel.mountOperator(it.text) } btnPlus.onClick { viewModel.mountOperator(it.text) }
内容的提问来源于stack exchange,提问作者user16778022
相关产品推荐
相关产品推荐

