1

我有一个布局,其中每个项目都LazyColumn可以显示一个特定于项目的对话框。显示Dialogs和工作正常,除了一些较大的,每当我尝试在其中一个对话框中编辑文本时,TextFields它都会触发对话框消失。

我尝试了很多不同的方法,最奇怪的是对话框工作正常,如果我在尝试显示对话框之前只滚动LazyColumn1 个项目,我可以编辑文本字段。

事实证明,很难在简单的设置中重现该问题,因为即使更改代码的基本元素也会使错误消失,但我终于成功了。该错误的外观似乎取决于LazyColumn存在Scrollable和键盘上的文本类型。接下来是一个有点长的代码示例和一个显示问题的 GIF:

@Composable
fun JointCourseTemplate(courseTemplateDto: CourseTemplateDto) {
    LazyColumn(
        //state= LazyListState()
    ){
        for(i in 0..4){
            item { TestPart(i = i) }
            for (j in 0..8){
                item { TestItem(i = j) }
            }
        }

    }
}

@Composable
fun TestPart(i:Int) {
    var showDialog by remember {
        mutableStateOf(false)
    }
    Row(Modifier.padding(8.dp)) {
        Text("part"+i)
        Button(onClick = { showDialog=true }) {
            Text("show dialog")
        }
    }
    
    PartDialog(showDialog = showDialog, hideDialog = {showDialog=false}) 
}

@Composable
fun TestItem(i:Int) {
    Row(Modifier.padding(8.dp)) {
        Text("item"+i)
        Button(onClick = { /*TODO*/ }) {
            Text("show dialog")
        }
    }
}

@OptIn(ExperimentalComposeUiApi::class)
@Composable
fun PartDialog(showDialog:Boolean, hideDialog: () -> Unit) {
    var text by remember {
        mutableStateOf("")
    }
    if (showDialog) {
        Dialog(properties = DialogProperties(
            dismissOnClickOutside = false,
            usePlatformDefaultWidth = false
        ),
            onDismissRequest = { hideDialog() }) {
            Surface(
                modifier = Modifier
                    //.wrapContentHeight()
                    //.fillMaxWidth(0.9f)
                    .width(400.dp)
                    .height(600.dp),
                shape = RoundedCornerShape(10.dp)
            ) {
                Column {
                    Text(text = "Some Dialog")
                    OutlinedTextField(value = text, onValueChange = {text=it}, label = { Text(text = "TroubleMaker")})
                }
            }
        }
    }
}

在此处输入图像描述

4

2 回答 2

2

此问题是由于您从位于屏幕底部的惰性单元格中打开对话框所致。因此,当键盘出现时,此单元格变得不可见并从视图树中删除。我会说这是预期的行为。

我建议您将对话框从LazyColumn. 也许您需要有关要在对话框中显示的特定项目的信息,您可以存储所选项目而不是布尔值:

val (selectedDialogItem, setSelectedItem) = remember { mutableStateOf<Int?>(null) }
LazyColumn {
    items(4) { i ->
        Row(Modifier.padding(8.dp)) {
            Text("part"+i)
            Button(onClick = {
                setSelectedItem(i)
            }) {
                Text("show dialog")
            }
        }
    }
}
if (selectedDialogItem != null) {
    Dialog(
        // ...
    )
}

ps 我在这里没有使用委托来允许在块selectedDialogItem内进行智能转换if

于 2022-02-11T11:28:11.510 回答
0

我确信这是一个需要 google 修复的错误,但是简单的解决方案是将 state 参数添加到 LazyColumn 中,如图所示。

val listState by remember{mutableStateOf(LazyListState())}
LazyColumn(state = listState  ){...}

我意识到这是一个非常小众的错误,但也许它可以帮助其他人节省时间

编辑

这显然是错误的,而且总是有效。不知道为什么它第一次起作用

于 2022-02-11T09:24:22.500 回答