Referencia no resuelta en el anonimo oyente de Kotlin

Tengo el código de abajo. Es Kotlin. ¿Alguna idea de por qué textToSpeech de textToSpeech.setLanguage(Locale.UK) está diciendo que no hay ninguna referencia 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 de plugin de Idea kotlin, pero parece que en realidad no se puede compilar

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

Para su caso, puedo sugerir como una solución con una expresión de objeto en esta construcción bastante engorroso:

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

Esto inicializará un objeto anónimo con el inner interno que es aceptable a través de la propiedad value . Tenga en cuenta que el inicializador inner utiliza propiedad de value . Entonces el value se extrae y se puede utilizar.

Pero tenga en cuenta que este truco es inseguro: en tiempo de ejecución, el uso de value antes de asignar inner (por ejemplo, en el constructor TextToSpeech ) arrojará NullPointerException .

También, he substituido el OnInitListener con un lambda que usa la conversión de SAM para ser corto, pero la expresión del objeto se puede todavía utilizar allí.


UPD: revisa esta pregunta por mi esfuerzo por generalizar este enfoque. Usándolo, puede escribir

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

Vea las fuentes en Github .

  • Desarrollo de aplicaciones similares a "Google ahora" - ¿es posible utilizar el reconocimiento de voz sin entrada de teclado?
  • TextToSpeech.setEngineByPackageName () no establece nada
  • Cómo dar pausa o brecha entre palabras en TTS en android
  • ¿Qué significan los nombres / códigos de Android Voice?
  • ¿Cómo instalar el motor TTS específico programáticamente en Android?
  • Android TTS añadir idiomas
  • ¿Cómo agregar un sonido al motor pico TTS de Android?
  • Android TTS no habla
  • TTS: El éxito regresó de onInit () pero aún hay retraso para hablar primero
  • La interfaz de usuario de texto a voz es un android lento
  • Pausa tono del teléfono mientras habla a través de texto a voz y luego reanudar
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.