Flutter Keyboard скрывает текстовое поле

Я новичок в трепете. Я добавил форму с текстовым полем, и когда я щелкнул текстовое поле и появилась клавиатура, текстовое поле поднялось.

Это мой код:

Widget build(BuildContext context) {

MediaQueryData mediaQuery = MediaQuery.of(context);
return new Scaffold(
  body:  new Container(
      color: Colors.purple,
      constraints: new BoxConstraints.expand(),
      padding: EdgeInsets.only(top: 10.0,left: 10.0,right: 10.0, bottom: mediaQuery.viewInsets.bottom, ),
      child: SingleChildScrollView(
        child: Container(
            child: Column(
                crossAxisAlignment: CrossAxisAlignment.center,
                mainAxisAlignment: MainAxisAlignment.center,
                children: <Widget>[
                  SizedBox(height: 12.0),
                  Text(
                    'What is your Business Name?',
                    style: TextStyle(fontSize: 24.0),
                  ),
                  AppForm(),
                ],
              ),
            padding: EdgeInsets.only(left: 10.0,right: 10.0, bottom: mediaQuery.viewInsets.bottom),
            decoration: BoxDecoration(
              borderRadius: BorderRadius.all(Radius.circular(30.0)),
              color: Colors.white,
                ),
              )
          )
      ),
    );
  }

Это результат без открытия клавиатуры: Изображение без клавиатуры

Это изображение после открытия клавиатуры: Изображение после открытия клавиатуры


Вот мой вывод доктора трепетания.

Doctor summary (to see all details, run flutter doctor -v): [√] Flutter 
(Channel beta, v0.5.1, on Microsoft Windows [Version 10.0.17134.165], locale 
en-US) [√] Android toolchain - develop for Android devices (Android SDK 
28.0.0) [√] Android Studio (version 3.1) [!] VS Code, 64-bit edition (version 
1.25.1) [!] Connected devices ! No devices available ! Doctor found issues in 
2 categories.

есть идеи, как это исправить?

У вас последняя версия флаттера? Что говорит flutter doctor?

Bostrot 14.07.2018 10:25

Вот мой вывод доктора трепетания. Краткое описание доктора (чтобы увидеть все подробности, запустите flutter doctor -v): [√] Flutter (бета-версия канала, v0.5.1, в Microsoft Windows [версия 10.0.17134.165], локаль en-US) [√] Набор инструментов Android - разработка для Устройства Android (Android SDK 28.0.0) [√] Android Studio (версия 3.1) [!] VS Code, 64-битная версия (версия 1.25.1) [!] Подключенные устройства! Нет доступных устройств! Врач обнаружил проблемы в 2 категориях.

Nirodya Gamage 14.07.2018 14:51

Я бы порекомендовал вам перейти к мастеру флаттера каналов flutter channel master, который в настоящее время находится на v5.7, а также очистить свой проект с помощью flutter clean и Invalidate caches and restart.

Bostrot 14.07.2018 15:05

Видел это ?? didierboelens.com/2018/04/…

TheAshwaniK 17.12.2019 11:27
27
4
40 581
14
Перейти к ответу Данный вопрос помечен как решенный

Ответы 14

Ответ принят как подходящий

Так было со мной. Вы определенно оборачиваете помост внутри другого помоста. внутри вашего приложения flutter должен быть только один виджет каркаса, то есть основной макет. Просто удалите все имеющиеся у вас предки каркаса и оставьте только один каркас. не заворачивайте строительные леса в другие леса. Несмотря на это, вы можете завернуть строительные леса в контейнер.

Убедитесь, что в вашем файле main.dart вы этого не делаете: -

✖✖

return Scaffold(
body : YourNewFileName(),
);

Несмотря на приведенный выше код, сделайте следующее: - ✔✔

return YourNewFileName();

@Nirodya Gamage, не могли бы вы опубликовать файл main.dart, чтобы я мог проверить, где ошибка ??

Aman Malhotra 14.07.2018 15:59

Мне очень жаль, что вы правы! Я нашел еще один эшафот на заднем плане. Я удалил один, и он работает. Огромное спасибо!

Nirodya Gamage 14.07.2018 17:07

Отлично . Потому что то же самое случилось со мной, и вот как я решил это.

Aman Malhotra 14.07.2018 18:48

У меня есть подмости внутри подмостей. Мне требуется добавить Tabbarview. Какое решение для этого.

Malavan 15.05.2020 13:16

Панель вкладок также может быть добавлена ​​с помощью одного Scaffold @dominic_torreto. На данный момент наличие каркаса внутри каркаса дает вам некоторые ошибки, подобные этой. поэтому вам следует изменить структуру, с помощью которой вы разрабатываете свое приложение.

Aman Malhotra 15.05.2020 15:37

Да. Меняет структуру. Даже несмотря на то, что это не работает.

Malavan 15.05.2020 16:48
 new Scaffold(
      appBar: new AppBar(
          ...
      resizeToAvoidBottomPadding: true,
      ....

Исправлена ​​проблема, когда текстовое поле было скрыто клавиатурой

по умолчанию это попытка и не работает

Dani 12.12.2020 09:38

resizeToAvoidBottomPadding устарел используйте вместо resizeToAvoidBottomInset: true

Это прекрасно работает. Установка resizeToAvoidBottomInset: true для Scaffold отрегулирует вид, чтобы он находился в области над вашей клавиатурой.

poomulus 25.03.2020 02:47

resizeToAvoidBottomInset по умолчанию имеет значение true. не нужно добавлять это

MJ Montes 20.08.2020 13:08

Этот ответ не относится к указанному выше вопросу, но может быть полезен тем, у кого все еще возникают проблемы с клавиатурой, закрывающей выбранное текстовое поле, независимо от того, что они делают. Я попал на эту страницу, пытаясь решить такую ​​проблему.

До возникновения проблемы я вносил некоторые изменения, чтобы попытаться улучшить экран-заставку при запуске приложения. По чьей-то рекомендации я включил следующую строку в раздел <resources><style> файла styles.xml в папке android / app / src / main / res / values.

<item name = "android:windowFullscreen">true</item>

Это привело к неожиданному эффекту остановки прокрутки любых полей в главном приложении при отображении клавиатуры. Для кого-то это могло быть очевидно, но не для меня.

Надеюсь, эта информация кому-то поможет.

Спасибо, что помогло

Shakle 19.08.2019 19:14

Спасибо. Я трачу много времени на поиски этой проблемы, и ничего не работает. Но я не понимаю, почему полноэкранный режим вызывает эту ошибку.

Clairton Luz 12.03.2020 19:01

Большое вам спасибо, я перепробовал все трюки с виджетами, но ничего не вышло.

hewa jalal 05.05.2020 02:04

Большое спасибо тебе, чувак. Я просто сделал все необходимое, чтобы исправить это, и просто понял, что он работает, до реализации заставки.

Virto111 11.05.2020 14:50

Это устранило мою проблему во всем приложении

Vamsi 17.05.2020 16:11

Рад, что это помогло вам, ребята. :-)

GrahamD 13.07.2020 14:18

ОМГ СПАСИБО !!

Candace 18.11.2020 21:12

Это устраняет эту проблему, но вызывает другие проблемы, если у вас есть верхний баннер. Строка состояния отображается (это одна), и это делается поверх баннера.

Dani 12.12.2020 09:35

Вы можете просто обернуть виджет, который вы не хотите скрывать клавиатурой, внутри отступа, как показано ниже:

Padding(
         child: YourWidget()
         padding: EdgeInsets.only(
         bottom: MediaQuery.of(context).viewInsets.bottom)); 

Просто вырежьте и вставьте свой код тела в это -

SingleChildScrollView(
        child: Stack(
          children: <Widget>[
              // your body code 
           ],
         ),
       ),

был такой же вопрос получил ответ здесь

Если вы используете Scaffold, то оборачивайте корпус SingleChildScrollView

Например, вот так:

...
return Scaffold(
body: SingleChildScrollView(
    child: Column(
      children: <Widget>[
        TextField(),
        TextField(),
        TextField(),
      ],
    ),
  ),
);
...

это было для меня действительно палочкой-выручалочкой. Теперь эшафот станет прокручиваемым.

Исправление для меня было похоже на ответ GrahamD.

Я объявлял свою тему, используя родительский элемент с расширением .Fullscreen, например:

<style name = "NormalTheme" parent = "@android:style/Theme.Black.NoTitleBar.Fullscreen">
    <item name = "android:windowBackground">@android:color/white</item>
</style>

Я поднял вопрос с командой Flutter, потому что должна быть возможность использовать полноэкранную тему и иметь нормальное поведение приложения чата.

<item name = "android:windowFullscreen">true</item>

Удаление строки выше из

android/app/src/main/res/values/styles.xml

сделал мое приложение фиксированным для автоматической прокрутки поля ввода вверх, чтобы его можно было увидеть на клавиатуре открывается

спасибо @GrahamD

У меня тоже была эта проблема. Эта строка была добавлена ​​в результате использования пакета flutter_native_splash. Не думаю, что я когда-нибудь нашел бы это. Спасибо.

Michael Tolsma 17.08.2020 17:03

Спасибо за это. У меня была такая же проблема из-за flutter_native_splash

cmd_prompter 10.09.2020 14:45

Это устраняет эту проблему, но вызывает другие проблемы, если у вас есть верхний баннер. Строка состояния отображается (это одна), и это делается поверх баннера.

Dani 12.12.2020 09:34

Я решил вышеупомянутую проблему, добавив Stack() в качестве тела моего Scaffold(), это позволяет объекту TextField() скользить вверх над виртуальной клавиатурой. Изначально я использовал SingleChildScrollView() для тела, в результате чего объекты TextField() были закрыты мягкой клавиатурой.

Решение, которое сработало для меня:

child: Scaffold(
          resizeToAvoidBottomInset: true,
          body: Stack(
            children: <Widget>[]

Вы должны добавить SingleChildScroolView в свой Scaffold и добавить обратное: правда в свой SingleChildScroolView

Scaffold(
body: SingleChildScrollView(
          reverse: true,
          child: Container()));

У меня была такая же проблема, я также использовал SingleChildScrollView, но это не решило мою проблему.

Моя проблема возникла в этом коде.

   Stack(
      childern:[
           SingleChildScrollView(),// In scollView i have textFeild when keyboard opens doneButton hide the textFeild.
           doneButtonWidget()//this button align with the bottom of the screen. 
   ]
)

Чтобы решить проблему, я следую этому, и это решило мою проблему.

    Column(
       childern:[
            Expaned(  
                child:SingleChildScrollView(),// In scollView i have textFeild when keyboard opens doneButton hide the textFeild.
               flex:1
              ),
              doneButtonWidget()//this button align with the bottom of the screen. 
             ]
          )

resizeToAvoidBottomInset по умолчанию имеет значение true.

return Scaffold ( resizeToAvoidBottomInset: ложь,

Я установил значение false, и он работал нормально

Согласно обновлениям флаттера (2021 г.), «resizeToAvoidBottomInset: true» выдает ошибку желто-черной полосы при появлении клавиатуры.

Вот как я исправил указанную выше проблему:

  1. Внутри метода build () проверьте, открыта ли клавиатура, bool keyboardIsOpen = MediaQuery.of (контекст) .viewInsets.bottom! = 0;
  2. Установите resizeToAvoidBottomInset: true внутри Scaffold
  3. Оберните свой виджет SizedBox () и установите высоту следующим образом: высота: keyboardIsOpen ? MediaQuery.of (контекст) .size.height * 0,2 : MediaQuery.of (контекст) .size.width * 0,6,

Другие вопросы по теме