user1114
user1114

Reputation: 1169

Android Kotlin: Smart cast to 'TextView' is impossible, because 'x' is a property that has open or custom getter

I use findViewById to get references to views in a custom DialogClass outside the view hierarchy. Since I want these references throughout the dialog class, and since they are not available until the call to setContentView, I use lazy field initialization in the dialog class definition:

private val balanceView : TextView? by lazy { dialog?.findViewById(R.id.balanceTextView)}

Later, in a separate function that runs after the call to setContentView, I have two commands related to balanceView:

private fun setupBalance(){
    balanceView!!.visibility = View.VISIBLE
    balanceView.text = presentation.balance
}

I expected the second command to compile since we are ensuring balanceView is not null in the first command. However, the compiler underlines the second command with this message:

Smart cast to 'TextView' is impossible, because 'balanceView' is a property that has open or custom getter

I was wondering how to interpret this message - to my knowledge the lazy keyword doesn't make a variable open.

Upvotes: 0

Views: 1024

Answers (1)

Tenfour04
Tenfour04

Reputation: 93739

The use of a property delegate like lazy means it has a custom getter. A custom getter prevents the compiler from being able to ensure that the value returned by the property will be the same in your two consecutive calls, so it cannot smart-cast.

Since balanceView is nullable, you shouldn't be using !! either, or your app will crash when balanceView is null. The correct way to write your function (if you don't know if balanceView is currently null) would be like this:

private fun setupBalance(){
    balanceView?.apply {
        visibility = View.VISIBLE
        text = presentation.balance
    }
}

If there's no chance of it being null, don't use a nullable property, and then you won't have to worry about null-safe calls and smart-casting. But you seem to also have a nullable dialog that it is dependent on. I don't know what's going on higher-up-stream, so I can't help with that.

Upvotes: 4

Related Questions