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

Simplest way of updating a textfield with the results of an async task in JetPack Compose

提问人:tautology 提问时间:11/16/2023 更新时间:11/16/2023 访问量:20

问:

我正在编写一个简单的 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)
   }
}

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

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

异步 喷气背包

评论


答:

1赞 Faruk Karaca 11/16/2023 #1

启动协程作用域并运行代码。使用 维护状态。如果根据结果进行更新,则将更新。这是实现目标的直接方法。但是,在这种类型的逻辑中,如果复合函数经历完全重构,则可能需要重新启动代码(需要 10 分钟才能执行)。outputoutputTextaddLine

对于更强大的解决方案,使用 a 和 a .但是,由于您特别要求最简单的逻辑,因此我以这种方式实现了它viewModelstateFlow

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) 

评论

0赞 tautology 11/17/2023
谢谢,这解决了我眼前的问题!我将研究 viewModel 和 stateFlow。
0赞 Faruk Karaca 11/17/2023
不要提:)