flutter 聊天界面底部输入框,键盘与自定义表情页面切换会出现抖动情况
时间: 2024-01-13 11:04:11 浏览: 37
抖动的情况通常是由于键盘的出现和隐藏导致布局重新计算引起的。为了避免这种抖动,您可以尝试使用`SingleChildScrollView`来包装整个页面,并使用`ResizeObserver`来监听键盘的高度变化。这样可以确保键盘的出现和隐藏不会引起布局的抖动。以下是一个示例代码:
```dart
import 'package:flutter/material.dart';
import 'package:flutter/rendering.dart';
class ChatScreen extends StatefulWidget {
@override
_ChatScreenState createState() => _ChatScreenState();
}
class _ChatScreenState extends State<ChatScreen> {
bool _isKeyboardVisible = false;
double _keyboardHeight = 0.0;
final ResizeObserver _resizeObserver = ResizeObserver();
@override
void initState() {
super.initState();
_resizeObserver.observe(MediaQuery.of(context).viewInsets.bottom);
_resizeObserver.onChange = () {
setState(() {
_keyboardHeight = _resizeObserver.dimensions.bottom;
});
};
}
@override
void dispose() {
_resizeObserver.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Chat'),
),
body: SingleChildScrollView(
child: Column(
children: [
ListView.builder(
shrinkWrap: true,
physics: NeverScrollableScrollPhysics(),
// Chat messages
itemBuilder: (context, index) => ListTile(
title: Text('Message $index'),
),
),
Container(
// Your chat input field
color: Colors.grey[200],
child: TextField(
decoration: InputDecoration(
hintText: 'Type a message...',
contentPadding: EdgeInsets.symmetric(horizontal: 16.0),
),
),
),
Container(
// Emoji picker or any other bottom panel
height: _keyboardHeight,
color: Colors.grey[300],
child: _isKeyboardVisible ? Text('Emoji Picker') : Text('Keyboard'),
),
],
),
),
);
}
}
```
在上述代码中,我们使用了`SingleChildScrollView`来包装整个页面,这样可以确保页面内容可以滚动。我们还使用了`ResizeObserver`来监听键盘的高度变化,并根据键盘的高度调整底部表情面板的高度。这样,无论键盘是显示还是隐藏,页面都不会出现抖动。
请注意,为了使`SingleChildScrollView`正常工作,您可能需要在父级`Column`中设置`shrinkWrap: true`和`physics: NeverScrollableScrollPhysics()`,以防止嵌套的`ListView.builder`滚动。
希望这可以解决您的问题!如果有任何进一步的疑问,请随时向我提问。