У меня есть такой столбец расширенных виджетов:
return new Container(
child: new Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: <Widget>[
new Expanded(
flex: 1,
child: convertFrom,
),
new Expanded(
flex: 1,
child: convertTo,
),
new Expanded(
flex: 1,
child: description,
),
],
),
);
Выглядит это так:
convertFrom
, включает TextField. Когда я нажимаю на это текстовое поле, на экране появляется клавиатура Android. Это изменяет размер экрана, поэтому размер виджетов изменяется следующим образом:
Есть ли способ, чтобы клавиатура «накладывала» на экран, чтобы размер моего столбца не менялся? Если я не использую Expanded
виджеты и жестко задаю высоту для каждого виджета, размер виджетов не изменяется, но при появлении клавиатуры я получаю ошибку с черно-желтыми полосами (потому что места недостаточно). Это также не подходит для всех размеров экрана.
Я не уверен, относится ли это к Android или Flutter.
Ответы:
В вашем
Scaffold
установите дляresizeToAvoidBottomInset
свойства значениеfalse
.Свойство resizeToAvoidBottomPadding устарело .... В вашем
Scaffold
установите дляresizeToAvoidBottomPadding
свойства значениеfalse
.источник
android:windowSoftInputMode="adjustPan"
? Если я добавлюresizeToAvoidBottomPadding
к каркасу, он закроет TextField.В большинстве других ответов предлагается использовать
resizeToAvoidBottomPadding=false
. По моему опыту, это позволяет клавиатуре закрывать текстовые поля, если они находятся под тем местом, где должна располагаться клавиатура.Мое текущее решение - заставить мой столбец иметь ту же высоту, что и экран, а затем поместить его в,
SingleChildScrollView
чтобы Flutter автоматически прокручивал мой экран вверх ровно настолько, когда используется клавиатура.Widget build(BuildContext context) { return Scaffold( body: SingleChildScrollView( physics: NeverScrollableScrollPhysics(), child: ConstrainedBox( constraints: BoxConstraints( minWidth: MediaQuery.of(context).size.width, minHeight: MediaQuery.of(context).size.height, ), child: IntrinsicHeight( child: Column( mainAxisSize: MainAxisSize.max, children: <Widget>[ // CONTENT HERE ], ), ), ), ), ); }
Я использую,
NeverScrollableScrollPhysics
чтобы пользователь не мог прокрутить себя.источник
NeverScrollableScrollPhysics
и все выглядит нормально, за исключением того, что пользователь может попытаться провести вверх и вниз, и они могут увидеть свечение над прокруткой. Когда я использую,NeverScrollableScrollPhysics
онresizeToAvoidBottomInset
Набор
resizeToAvoidBottomInset
дляfalse
вместоresizeToAvoidBottomPadding
которых является устаревшим.return Scaffold( resizeToAvoidBottomInset : false, body: YourWidgets(), );
источник
Метод 1: Удалите
android:windowSoftInputMode="adjustResize"
из файла AndroidManifest.xml ( В противном случае он будет перекрывать флаттер кода) и добавитьresizeToAvoidBottomPadding: false
в строительном лесе , как показано ниже:Scaffold( resizeToAvoidBottomPadding: false, appBar: AppBar() )
Метод 2 (не рекомендуется): просто добавьте
android:windowSoftInputMode="stateVisible"
в android AndroidManifest.xml в активности, он будет работать только для Android, а не для IOS.<activity ... android:windowSoftInputMode="stateVisible">
Примечание. Не устанавливайте значение
android:windowSoftInputMode="adjustResize"
источник
Что ж, я думаю, если мы реализуем решение @Aman, это заставит наше приложение вести себя некрасиво, так как при появлении клавиатуры оно не будет настраивать наше окно просмотра на доступную высоту и будет различать другие поля, скрытые за клавиатурой. Поэтому я бы предложил использовать
SingleChildScrollView
вместо этого.Оберните свой код,
SingleChildScrollView
как указано ниже,return new Container( child: SingleChildScrollView( child: new Column( crossAxisAlignment: CrossAxisAlignment.stretch, children: <Widget>[ new Expanded( flex: 1, child: convertFrom, ), new Expanded( flex: 1, child: convertTo, ), new Expanded( flex: 1, child: description, ), ], ), ), );
источник
В зависимости от варианта использования вы также можете рассмотреть возможность использования списка . Это обеспечит прокрутку содержимого, когда места недостаточно. В качестве примера вы можете посмотреть демонстрацию текстового поля в приложении галереи.
источник
Мой подход заключается в использовании
SingleChildScrollView
сClampingScrollPhysics
физикой.источник
Для меня изменение свойства ниже элемента с true на false
<item name="android:windowFullscreen">false</item>
в файле
заставил Flutter перетаскивать все содержимое страницы вверх в фокусе ввода
источник
Я предлагаю использовать в
resizeToAvoidBottomInset: false
любом случае, чтобы предотвратить изменение размера виджетов, если клавиатура внезапно появляется на экране. Например, если пользователь использует заголовки чата Facebook в вашем приложении.Чтобы клавиатура не накладывала виджеты на нужные вам экраны, я предлагаю следующий подход, при котором высота
SingleChildScrollView
уменьшается до высоты доступного пространства. В этом случаеSingleChildScrollView
также выполняется прокрутка к виджету в фокусе.final double screenHeight = MediaQuery.of(context).size.height; final double keyboardHeight = MediaQuery.of(context).viewInsets.bottom; return Scaffold( resizeToAvoidBottomInset: false, body: SizedBox( height: screenHeight - keyboardHeight, child: SingleChildScrollView( child: Column( children: [ const SizedBox(height: 200), for (var i = 0; i < 10; i++) const TextField() ], ), ), ), );
источник