Клавиатура скрывает TextField в PageView - PullRequest
0 голосов
/ 30 мая 2020

У меня довольно сложный экран с просмотром страниц и FutureBuilder. В PageBuilder у меня также есть TextFormField, когда я теперь нажимаю на текстовое поле, клавиатура открывается, как и ожидалось. Но затем он скрывает текстовое поле и кнопку под текстовым полем. Я уже искал решения, вещи, которые я пробовал:

  • установка resizeToAvoidBottomInset в значение true
  • размещение внешнего столбца или просмотра страницы в SingleChildScrollView
  • добавление немного отступов (размером с клавиатуру) снизу

Есть другие идеи?

У меня только ОДНА Леса.

Ответы [ 3 ]

0 голосов
/ 30 мая 2020

Сделайте страницу прокручиваемой и добавьте к кнопке отступы, например:

SingleChildScrollView(
   child: Column(
      children: 
         textInput,
         Padding(padding: ..., child: button) 
             ...

Это позволит пользователю прокручивать страницу до кнопки после редактирования.

Другое решение - сделать кнопку плавающей - всегда будет над клавиатурой

    return Stack(
      children: <Widget>[
        Positioned(
          child: SingleChildScrollView(
              child: Column(
                  children: [textInput]
                    ..add(Container(
                      height: 1111, // button heigh, so could scroll underlapping area
                    )))),
        ),
        Positioned(
          child: Align(
            alignment: Alignment.bottomCenter,
            child: button,
          ),
        )
      ],
    );
0 голосов
/ 31 мая 2020

Вы пробовали это?

Вы должны обернуть свою страницу SingleChildScrollView , чтобы вы получали прокрутку в случае, когда ваш контент становится больше, чем высота устройства из-за введения клавиатуры.

Soution

1) Использование WidgetsBindingObserver mixin

2) Добавление scrollController к SingleChildScrollView

3) Прослушивание события присутствия клавиатуры с использованием didChangeMetrics и прокрутка в соответствии с необходимостью.

class _SignInState extends State<SignIn> with WidgetsBindingObserver{

ScrollController _scrollController = new ScrollController();

void initState() {
    super.initState();
    WidgetsBinding.instance.addObserver(this);
  }

  @override
  void dispose() {
    WidgetsBinding.instance.removeObserver(this);
    super.dispose();
  }

  @override
  void didChangeMetrics() {
    _scrollController.jumpTo(200); //as per your need
  }

Виджет Inside Scaffold, добавляющий контроллер в SingleChildScrollView

  body: SingleChildScrollView(
        controller: _scrollController,
    )
0 голосов
/ 30 мая 2020

Какой подход вы используете для определения размера клавиатуры? Наилучший подход - добавить нижний отступ, который подталкивает текстовое поле вверх, вы также можете поместить поля формы внутри SingleChildScrollView, о котором вы упомянули:

padding: EdgeInsets.only(bottom: MediaQuery.of(context).viewInsets.bottom + 10 
...