我有如下的UI界面:
val scrollState = rememberScrollState()
Column(
modifier = Modifier
.fillMaxSize(1F)
.padding(horizontal = 16.dp)
.verticalScroll(scrollState)
) {
TextField(...)
// multiple textfields
TextField(
//...
modifier = Modifier.focusOrder(countryFocus).onFocusChanged {
if(it == FocusState.Active) {
// scroll to this textfield
}
},
)
}
我在这一列中有多个文本字段,当其中一个字段获得焦点时,我想滚动到该列。scrollState中有一个方法scrollState.smoothScrollTo(0f)
,但我不知道如何获取已聚焦的TextField的位置。
更新:
看起来我已经找到了一个可行的解决方案。我使用了onGloballyPositioned
,它有效了。但我不确定这是否是解决此问题的最佳方法。
var scrollToPosition = 0.0F
TextField(
modifier = Modifier
.focusOrder(countryFocus)
.onGloballyPositioned { coordinates ->
scrollToPosition = scrollState.value + coordinates.positionInRoot().y
}
.onFocusChanged {
if (it == FocusState.Active) {
scope.launch {
scrollState.smoothScrollTo(scrollToPosition)
}
}
}
)
bringIntoView()
之前添加awaitFrame()
解决了我的问题。 - OscarCreator