Referencia no resuelta dentro del oyente Kotlin anónimo

Tengo el código a continuación. Es Kotlin. ¿Alguna idea de por qué textToSpeech de textToSpeech.setLanguage(Locale.UK) dice que no hay una reference resuelta para textToSpeech ?

 val textToSpeech = TextToSpeech( applicationContext, object : TextToSpeech.OnInitListener { override fun onInit(status: Int) { if (status == TextToSpeech.SUCCESS) { textToSpeech.setLanguage(Locale.UK) } } }) 

Al principio asumí que es un error del plugin de Idea Kotlin, pero parece que en realidad no se puede comstackr

Kotlin ha endurecido la política de initialization de variables, y ahora está prohibido hacer reference a la variable dentro de su inicializador, incluso en lambdas y expresiones de object, lo que parece razonable: imagine que se llama a un lambda inmediatamente antes de la asignación de la variable.

Para su caso, puedo sugerir como una solución utilizando una expresión de object en este constructo bastante engorroso:

 val textToSpeech = object { val value: TextToSpeech get() = inner private val inner = TextToSpeech( applicationContext, { value.setLanguage(Locale.UK) } ) }.value 

Esto inicializará un object anónimo con inner interno que es aceptable a través de la propiedad de value . Tenga en count que el inicializador inner usa la propiedad del value . Luego se extrae el value y se puede usar.

Pero tenga en count que este truco no es seguro: en time de ejecución, el uso del value antes de que inner se asigne (por ejemplo, en el constructor TextToSpeech ) arrojará NullPointerException .

Además, he reemplazado el OnInitListener con un lambda utilizando la conversión SAM para que sea corto, pero la expresión del object aún se puede usar allí.


UPD: verifique esta pregunta por mi esfuerzo para generalizar este enfoque. Utilizándolo, puedes escribir

 val textToSpeech = selfReference { TextToSpeech( applicationContext, { self.setLanguage(Locale.UK) } ) } 

Ver las fonts en Github .