如何自动滚动到滚动日志类型文本可组合项的底部

hop*_*pia 3 android kotlin android-jetpack-compose android-jetpack-compose-text

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

log 1
log 2
log 3
log 4
Run Code Online (Sandbox Code Playgroud)

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

log 2
log 3
log 4
log 5
Run Code Online (Sandbox Code Playgroud)

我想找到解决方案的具体问题是每次文本值发生变化时如何向下滚动到底部。我尝试了可接受的解决方案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),
  )
}
Run Code Online (Sandbox Code Playgroud)

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

Jan*_*ína 5

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

另外,LaunchedEffect默认情况下 lambda 是在协程作用域中启动的,因此您不需要自己的。

试试这样:

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

  var logState = rememberScrollState(0)

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

  ...
}
Run Code Online (Sandbox Code Playgroud)

这意味着:每次发生log.value变化时,都执行 lambda。

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