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 .

  • Texto de Android a voz Voz masculina
  • Problema de STOP de texto a voz
  • ¿Por qué no se llama a UtteranceProgress Listener a Text to Speach?
  • ¿Por qué la intención de ACTION_CHECK_TTS_DATA es "incómoda de usar"?
  • La función de devolución de llamada de Android TTS onUtteranceCompleted no se recibe
  • TextToSpeech versión de compilación android no reproduce audio
  • ¿Cómo puedo guardar el archivo Text to Speech como formato .wav / .mp3 en idioma árabe en External Storage?
  • Ampliación del paquete de idiomas de texto a voz (TTS) de Android
  • Pausa tono del teléfono mientras habla a través de texto a voz y luego reanudar
  • Android "speak fallado: no está vinculado al motor tts"
  • Cómo detener android.speech.tts.TextToSpeech?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.