Dart 在Flitter应用程序中的ListView滚动中隐藏/关闭键盘
我在颤振应用程序中有聊天窗口。 消息在Dart 在Flitter应用程序中的ListView滚动中隐藏/关闭键盘,dart,flutter,keyboard,flutter-layout,Dart,Flutter,Keyboard,Flutter Layout,我在颤振应用程序中有聊天窗口。 消息在ListViewwidget中显示为widget,我还将用于消息输入的widget附加到窗口底部 我想 滚动列表视图时隐藏键盘 从InputWidget 代码: class\u messagespagentate扩展状态{ 最终ScrollController列表ScrollController=ScrollController(); @凌驾 小部件构建(构建上下文){ 返回脚手架( .... 主体:堆栈( 儿童:[ ListView.builder( 控制
ListView
widget中显示为widget,我还将用于消息输入的widget附加到窗口底部
我想
InputWidget
class\u messagespagentate扩展状态{
最终ScrollController列表ScrollController=ScrollController();
@凌驾
小部件构建(构建上下文){
返回脚手架(
....
主体:堆栈(
儿童:[
ListView.builder(
控制器:listScrollController
....
),
InputWidget()]
);
}
类InputWidget扩展了无状态Widget{
最终文本编辑控制器_TextEditingController=TextEditingController();
....
划船(
儿童:[
文本字段(
控制器:_textededitingcontroller
),
图标按钮(图标:..,按下:(){})
]
)}
关于你问题的第1点:
您可以为listScrollController
创建一个侦听器函数,其中包含对匿名FocusNode
的调用(此想法来自此高度投票),当发生任何滚动事件时,焦点将从文本字段中获取,键盘将被关闭:
class _MessagesPageState extends State<MessagesPage> {
final ScrollController listScrollController = ScrollController();
@override
void initState() {
listScrollController.addListener(_scrollListener);
super.initState();
}
_scrollListener() {
FocusScope.of(context).requestFocus(FocusNode());
}
@override
Widget build(BuildContext context) {
return Scaffold(
....
body: Stack(
children: [
ListView.builder(
controller: listScrollController
....
),
InputWidget(controller: listScrollController)]
);
}
关于你问题的第1点:
您可以为listScrollController
创建一个侦听器函数,其中包含对匿名FocusNode
的调用(此想法来自此高度投票),当发生任何滚动事件时,焦点将从文本字段中获取,键盘将被关闭:
class _MessagesPageState extends State<MessagesPage> {
final ScrollController listScrollController = ScrollController();
@override
void initState() {
listScrollController.addListener(_scrollListener);
super.initState();
}
_scrollListener() {
FocusScope.of(context).requestFocus(FocusNode());
}
@override
Widget build(BuildContext context) {
return Scaffold(
....
body: Stack(
children: [
ListView.builder(
controller: listScrollController
....
),
InputWidget(controller: listScrollController)]
);
}
这很简单,按照下面的步骤做
将类更改为StatefullWidget
创建最终滚动控制器列表ScrollController=ScrollController();
ListView应该是这样的:
ListView.builder(
controller: listScrollController,
reverse: true,
如果您通过以下方式使用firebase变更单:
.orderBy('timestamp',降序:true)
在“发送”按钮中添加此代码
listScrollController.animateTo(0.0,持续时间:持续时间(毫秒:300),曲线:Curves.easeOut);
自动向上滚动文本字段,将文本字段
和列表视图
添加到堆栈中
这很容易。按照以下步骤操作
将类更改为StatefullWidget
创建最终滚动控制器列表ScrollController=ScrollController();
ListView应该是这样的:
ListView.builder(
controller: listScrollController,
reverse: true,
如果您通过以下方式使用firebase变更单:
.orderBy('timestamp',降序:true)
在“发送”按钮中添加此代码
listScrollController.animateTo(0.0,持续时间:持续时间(毫秒:300),曲线:Curves.easeOut);
自动向上滚动文本字段,将文本字段
和列表视图
添加到堆栈中
要在列表视图滚动时隐藏键盘,只需将键盘行为添加到其中。示例
ListView(
keyboardDismissBehavior: ScrollViewKeyboardDismissBehavior.onDrag,
children: [],
)
要隐藏listview滚动时的键盘,只需向其添加键盘行为即可
ListView(
keyboardDismissBehavior: ScrollViewKeyboardDismissBehavior.onDrag,
children: [],
)
谢谢,它看起来像预期的那样工作!我现在意识到,当显示键盘时,一些消息被键盘溢出,所以我需要相应地滚动我的ListView?一点也不!顺便说一下,我在发布之前测试了代码。你能推荐一些评论中的问题吗?哪种溢出?你能解释一下吗?一些消息是没有键盘的屏幕现在隐藏在显示的键盘后面。因此,当键盘出现时,我需要将消息向上移动谢谢,它似乎按照预期工作!我现在意识到,当显示键盘时,一些消息被键盘溢出,所以我需要相应地滚动我的ListView?一点也不!顺便说一句,我在发布之前测试了代码。你能推荐一些评论中的问题吗?哪种溢出?你能解释一下吗?一些在没有键盘的情况下看到的消息现在隐藏在显示的键盘后面。所以当键盘出现时,我需要将消息向上移动