Это вот как я это делаю:
Используйте readState как изменяемое состояние, если пользователь нажимает, измените его на true, чтобы отобразить значок загрузки, вызовите API и прочитайте текст, а затем измените его. вернитесь к false, чтобы показать изображение. Все делается асинхронно путем вызова сопрограммы запуска
Код: Выделить всё
class WordWidget : GlanceAppWidget(), CoroutineScope {
var tts: TextToSpeech? = null
var readingState = mutableStateOf(false)
override val coroutineContext: CoroutineContext
get() = Dispatchers.IO
override suspend fun provideGlance(context: Context, id: GlanceId) {
initializeTextToSpeech(context)
provideContent {
Content(context)
}
}
fun makeSentenceAndRead() {
launch {
try {
readingState.value = true
val sentence = getTextFromAPI()
tts?.speak(sentence, TextToSpeech.QUEUE_FLUSH, null, "sentenceWidget")
} finally {
readingState.value = false
}
}
}
private fun initializeTextToSpeech(context: Context) {
tts = TextToSpeech(context) { status ->
if (status != TextToSpeech.ERROR) {
tts?.language = Locale.GERMAN
}
}
}
// This is the widget content
@Composable
fun Content(
context: Context
) {
Column(
) {
Row(
modifier = GlanceModifier.fillMaxWidth().clickable { makeSentenceAndRead() }
) {
if (readingState.value) {
CircularProgressIndicator()
} else {
Image()
}
}
}
}
}
В чем здесь может быть проблема? Я пытался использовать Dispatchers.Default, но та же проблема все еще сохраняется.
Мое первое приложение для Android на Kotlin, использующее Glance. Может ли кто-нибудь сказать мне, в чем может быть проблема, пожалуйста?< /п>
Подробнее здесь: https://stackoverflow.com/questions/786 ... g-properly
Мобильная версия