Скрыть / Отклонить клавиатуру на прокрутке ListView в приложении Flutter - PullRequest
0 голосов
/ 12 мая 2019

У меня есть окно чата в приложении 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: (){})
  ]
 )}

1 Ответ

1 голос
/ 12 мая 2019

Что касается пункта 1 вашего вопроса:

Вы можете создать функцию слушателя для 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)]
   );
}

Точка 2:

Вы заметите, что я изменил ваш InputWidget, чтобы он принял ScrollController в качестве параметра, чтобы вы могли передать ему свой контроллер 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);
    })
  ]
 )}
...