Jetpack Compose焦点请求者不能与Dialog一起工作



我使用下面的代码来尝试和请求焦点到一个文本字段,并有键盘出现。目前文本框请求焦点,但键盘无法显示。同样的代码在我工作的另一个项目中工作,但这里的区别是这个代码是在一个可组合的对话框中,而其他代码不是,所以我不确定它的对话框是否使键盘无法显示?

val textField = remember { FocusRequester() }
Dialog(onDismissRequest = {
openDialog.value = false
dialogInput.value = ""
}) {
Column(
modifier = Modifier
.height(274.dp)
.background(Color.Transparent)
.clickable {
openDialog.value = false
dialogInput.value = ""
}
) {
OutlinedTextField(
modifier = Modifier
.height(64.dp)
.background(Color.White)
.focusRequester(textField),
label = {
Text(
text = label,
style = MaterialTheme.typography.body2.copy(color = Color.Black)
)
},
value = dialogInput.value,
onValueChange = {
dialogInput.value = it
events.filterPlayers(it)
},
textStyle = MaterialTheme.typography.body2.copy(color = Color.Black),
colors = TextFieldDefaults.textFieldColors(
backgroundColor = Color.White,
unfocusedIndicatorColor = Color.White,
focusedIndicatorColor = Color.White
)
)
DisposableEffect(Unit) {
textField.requestFocus()
onDispose {}
}
}
val focusRequester = FocusRequester()
LocalView.current.viewTreeObserver.addOnWindowFocusChangeListener {
if (it) focusRequester.requestFocus()
}

这个工作对我来说,窗口对话框得到聚焦后,请求焦点TextField将自动显示软键盘。

下面是来自https://issuetracker.google.com/issues/204502668的一个更健壮的解决方案,它使用LaunchedEffect的副作用,而不仅仅是在每次重组中添加侦听器:

val windowInfo = LocalWindowInfo.current
LaunchedEffect(windowInfo) {
snapshotFlow { windowInfo.isWindowFocused }.collect { isWindowFocused ->
if (isWindowFocused) {
focusRequester.requestFocus()
}
}
}

最新更新