0

我正在尝试实现Text日志类型消息的视图,其中对文本的每次更改都会将文本自动滚动到最后/新添加的文本行。例如,如果我的文本大小只适合 4 行:

log 1
log 2
log 3
log 4

并添加了一个新行,那么输出应该是:

log 2
log 3
log 4
log 5

我想找到解决方案的具体问题是每次文本值发生变化时如何向下滚动到底部。我尝试了可接受的解决方案TextField,其中 aLaunchedEffect在组合阶段触发,但在我的情况下不起作用:

@Composable
fun LogText(log: State<String>) {

  var logState = rememberScrollState(0)
  val coroutineScope = rememberCoroutineScope()

  LaunchedEffect(coroutineScope) {
      logState.scrollTo(logState.maxValue)
  }

  Text(
      text = log.value,
      modifier = Modifier.verticalScroll(logState),
  )
}

LaunchedEffect没有更改文本以向下滚动到最新行。

4

1 回答 1

2

你的用法LaunchedEffect是错误的。LaunchedEffect每次LaunchedEffect更改 ' 键时,都会执行您传递给 的 lambda 。您使用记住的协程范围作为键,它永远不会改变,因此您的效果只执行一次。

此外,LaunchedEffectlambda 默认在协程范围内启动,因此您不需要自己的。

试试这样:

@Composable
fun LogText(log: State<String>) {

  var logState = rememberScrollState(0)

  LaunchedEffect(log.value) {
      logState.scrollTo(logState.maxValue)
  }

  ...
}

这意味着:每次log.value更改时,执行 lambda。

还有一件事:如果你的文字真的很长,那么画它会很重。我会考虑将其按行拆分List<String>LazyColumn与多个Text项目一起使用...

于 2022-01-24T21:03:02.727 回答