I have the code below. It is Kotlin. Any idea why textToSpeech
from textToSpeech.setLanguage(Locale.UK)
is telling that there is no reference resolved for textToSpeech
?
val textToSpeech = TextToSpeech(
applicationContext,
object : TextToSpeech.OnInitListener {
override fun onInit(status: Int) {
if (status == TextToSpeech.SUCCESS) {
textToSpeech.setLanguage(Locale.UK)
}
}
})
At first I assumed it is an Idea kotlin plugin bug, but it seems that it actually can't be compiled
Kotlin has hardened the variables initialization policy, and it's now prohibited to reference the variable inside its initializer, even in lambdas and object expressions, which seems reasonable: imagine that a lambda is called immediately before the variable assignment.
For your case, I can suggest as a workaround using an object expression in this quite cumbersome construct:
val textToSpeech = object {
val value: TextToSpeech get() = inner
private val inner = TextToSpeech(
applicationContext,
{ value.setLanguage(Locale.UK) }
)
}.value
This will initialize an anonymous object with inner
inside that is acceptable through value
property. Note that the inner
initializer uses value
property. Then the value
is extracted and can be used.
But please keep in mind that this trick is unsafe: in runtime, using value
before inner
is assigned (e.g. in TextToSpeech
constructor) will throw NullPointerException
.
Also, I've replaced the OnInitListener
with a lambda using SAM conversion to be short, but object expression can still be used there.
val textToSpeech = selfReference {
TextToSpeech(
applicationContext,
{ self.setLanguage(Locale.UK) }
)
}
See the sources on Github.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With