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?一点也不!顺便说一句,我在发布之前测试了代码。你能推荐一些评论中的问题吗?哪种溢出?你能解释一下吗?一些在没有键盘的情况下看到的消息现在隐藏在显示的键盘后面。所以当键盘出现时,我需要将消息向上移动