在 Flutter 应用程序中的 ListView 滚动上隐藏/关闭键盘

moo*_*der 3 keyboard dart flutter flutter-layout

我在 Flutter 应用中有聊天窗口。消息显示为小部件内的ListView小部件,我还有附加到窗口底部的消息输入小部件。

我想要

  1. 当我滚动时隐藏键盘 ListView
  2. 添加新消息时滚动到最后一条消息 InputWidget

代码:

class _MessagesPageState extends State<MessagesPage> {
  final ScrollController listScrollController = ScrollController();

  @override
  Widget build(BuildContext context) {
    return Scaffold(
    ....
    body: Stack(
        children: [
          ListView.builder(
              controller: listScrollController
              ....
          ),
          InputWidget()]
    );
}

class InputWidget extends StatelessWidget {

  final TextEditingController _textEditingController = TextEditingController();

....
Row (
  children: [
    TextField(
     controller: _textEditingController
    ), 
    IconButton(icon: ...., onPressed: (){})
  ]
 )}
Run Code Online (Sandbox Code Playgroud)

Maz*_*him 5

至于你的问题第一点:

您可以创建一个侦听器函数来listScrollController包含对匿名的调用FocusNode(想法取自这个高度投票的答案),并且当发生任何滚动事件时,焦点将从您手中夺走TextField,键盘将被解除:

 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)]
   );
}
Run Code Online (Sandbox Code Playgroud)

第2点:

您会注意到我修改了您的参数InputWidget以将 aScrollController作为参数,因此您可以将ListView控制器传递给它。当IconButton按下 时,listScrollController将根据您的需要跳至末尾。

 class InputWidget extends StatelessWidget {

 InputWidget({Key key,this.controller}) : super(key: key);

 final ScrollController controller ;

 final TextEditingController _textEditingController = TextEditingController();

 ....
 Row (
  children: [
    TextField(
      controller: _textEditingController
    ), 
    IconButton(icon: ...., onPressed: (){
      controller.jumpTo(controller.position.maxScrollExtent);
    })
  ]
 )}
Run Code Online (Sandbox Code Playgroud)


BLB*_*BLB 5

要在列表视图滚动时隐藏键盘,您只需向其添加keyboardDismissBehavior。例子

ListView(
 keyboardDismissBehavior: ScrollViewKeyboardDismissBehavior.onDrag,
 children: [],
)
Run Code Online (Sandbox Code Playgroud)

  • 漂亮,当你只有一个衬垫时,谁还需要一个滚动控制器 (2认同)