Кнопка, появляющаяся над клавиатурой в трепете

#flutter #mobile #flutter-layout

Вопрос:

У меня есть макет, кнопка входа в систему находится в нижней части экрана, а TextFormField » ы » — в верхней части экрана. У меня есть проблема, когда я хочу отобразить кнопку над клавиатурой, когда она появится, но у меня возникают трудности с этим. Я хочу чистое решение, а не какой-то хак, но, похоже, не могу его найти. Возможно ли использование floatingActionButton или bottomNavigationBar решение и использование MediaQuery.of(context).viewInsets.bottom ? Вот код и картинки.

У меня есть такой вид экрана:

введите описание изображения здесь

но когда появляется клавиатура, я не вижу кнопки входа в систему:

введите описание изображения здесь

Я хотел поместить кнопку прямо под паролем TexFormField после того, как появится клавиатура. Есть ли какое-то простое решение, но все же не взлом для этого? Вот код:

 Scaffold(
            resizeToAvoidBottomInset: false, // <- here I set this to false so my whole widget doesn't resize when the keyboard appears
            backgroundColor: Colors.white,
            body: Column(
              mainAxisAlignment: MainAxisAlignment.spaceBetween,
              children: <Widget>[
                Column(
                  children: [
                    SizedBox(
                      height: 48.0,
                    ),
                    Padding(
                      padding: const EdgeInsets.only(left: 24.0, right: 25.0),
                      child: Form(
                        key: _loginFormKey,
                        child: Column(
                          children: [
                            TextFormField(
                              onChanged: (value) {
                                setState(() => email = value);
                              },
                            ),
                            SizedBox(
                              height: 24.0,
                            ),
                            TextFormField(
                              onChanged: (value) {
                                setState(() => password = value);
                              },
                            ),
                          ],
                        ),
                      ),
                    ),
                  ],
                ),
                Padding(
                  padding: const EdgeInsets.only(
                      left: 23.0, right: 24, bottom: 64.0),
                  child: SizedBox(
                    width: double.infinity,
                    child: PrimaryButton(
                      buttonText: 'LOG IN',
                    ),
                  ),
                ),
              ],
            ),
          );
 

Заранее спасибо за вашу помощь!

Комментарии:

1. Вы должны использовать виджет стека и поместить в него свой столбец с полями и кнопкой.

Ответ №1:

В вашем коде вы должны избегать resizeToAvoidBottomInset: false, что делает вашу кнопку невидимой, и да, я вижу, вам нужно пространство между текстом редактирования и кнопкой, поэтому вы добавляете Colum в качестве родителя. но есть еще один лучший способ добиться этого, и кнопка » да » появится в приведенном ниже коде, как вы и ожидали.

 Scaffold(
      backgroundColor: Colors.white,
      body:

           Stack(
          children: [
            Padding(
              padding: const EdgeInsets.only(left: 24.0, right: 25.0),
              child: Form(
                child: Column(
                  children: [
                    TextFormField(
                      onChanged: (value) {},
                    ),
                    SizedBox(
                      height: 24.0,
                    ),
                    TextFormField(
                      onChanged: (value) {},
                    ),
                  ],
                ),
              ),
            ),
            Align(
              alignment: Alignment.bottomCenter,
              child: Padding(
                padding:
                    const EdgeInsets.only(left: 23.0, right: 24, bottom: 64.0),
                child: SizedBox(
                    width: double.infinity,
                    child: ElevatedButton(
                      child: Text("Button"),
                      onPressed: () {},
                    )),
              ),
            ),
          ],
        )
    );
 

Ответ №2:

Можете ли вы обернуть Singlechildscrollview виджет на колонку тела?