我试图观察聊天应用程序中键盘可见性的状态,以便在键盘出现时将包含我的消息的惰性列滚动到底部。为此,我像这样存储
WindowInsets.isImeVisible
:
@OptIn(ExperimentalLayoutApi::class)
@Preview(showBackground = true)
@Composable
fun ChatScreen(viewModel: ChatScreenViewModel = ChatScreenViewModel()) {
val messages = viewModel.messageListState
val listState = viewModel.messageListScrollState
val keyboardVisibility = WindowInsets.isImeVisible
Column(.....)
这是上下文的 ViewModel 属性:
class ChatScreenViewModel: ViewModel() {
val messageListScrollState = LazyListState()
val textFieldState = mutableStateOf("")
val messageListState = mutableStateListOf<String>(
"dummy message 1",
"dummy message 2",
"dummy message 3",
"dummy message 4"
)
问题是,每当触发
isImeVisible
时(例如,我点击文本字段,键盘出现,我输入一些内容,然后隐藏键盘),包括 textFieldState
和 messageListState
在内的所有状态都会重置为其原始值并失去其更新的值。即使将 isImeVisible
值保留在变量中似乎也会导致问题,并且只有当我将其从代码中完全删除时,事情才会恢复正常。
将 ViewModel 实例化方法更改为以下方法似乎已经解决了问题:
fun ChatScreen(viewModel: ChatScreenViewModel = viewModel())