使用 JetPack Compose 中异步任务的结果更新文本字段的最简单方法

问题描述 投票:0回答:1

我正在编写一个简单的 Android 应用程序,它需要在后台执行长时间运行的任务,然后返回该响应(任务长度最多为 10 分钟)。 Kotlin 中似乎有数十种运行异步任务的方法,所有这些方法都有自己奇怪的怪癖。

我希望它工作的方式(用于测试)是创建一个带有标题和值的行。它应该在后台启动异步任务时放入该值的占位符文本。任务完成后,我希望值会更新。不需要与应用程序进行任何用户交互。

我尝试使用 LaunchedEffect 来做到这一点,因为这似乎是最简单的技术,使用可组合函数,例如:

@Composable
fun addLine(name: String, pwd: String)
{
   Row
   {
      var output: String="Not Found"
      Text(name)

      LaunchedEffect(Unit)
      {
         val guess: String=bruteforce(pwd)
         if (guess != "")
         {
            # Value to update the text to
            output=guess
         }
      }
      # This is the text the needs to change
      Text(output)
   }
}

我无法想出任何简单的方法来做到这一点,所有易于 Google 搜索的示例都需要用户交互或多个额外步骤或奇怪的自定义库。这应该是一个微不足道的任务,并且在其他框架中,但完全击败了我。

我并不太在意是否应该这样做——我只是想要一种简单的机制,用异步执行的值来更新一个或多个文本字段。复杂的任务只会执行一次。

asynchronous jetpack
1个回答
0
投票

您启动一个协程作用域并运行您的代码。您可以使用

output
维持状态。如果您根据结果更新
output
,则
Text
将被更新。这是实现目标的简单方法。然而,在这种类型的逻辑中,如果您的
addLine
compose 函数经历了完全重构,则需要 10 分钟执行的代码可能需要重新启动。

为了获得更强大的解决方案,使用

viewModel
stateFlow
更有意义。不过,既然你特意要求最简单的逻辑,我就这样实现了

val scope = rememberCoroutineScope()
var output by remember { mutableStateOf("") }

scope.launch {
    delay(1000) // here add your logic

    output = "your text after logic" // set output to text
}

Text(output) 
© www.soinside.com 2019 - 2024. All rights reserved.