Я собираю пользовательский ввод с помощью, TextFormField
и когда пользователь нажимает FloatingActionButton
кнопку, указывающую, что они выполнены, я хочу закрыть экранную клавиатуру.
Как отключить автоматическое отключение клавиатуры?
import 'package:flutter/material.dart';
class MyHomePage extends StatefulWidget {
MyHomePageState createState() => new MyHomePageState();
}
class MyHomePageState extends State<MyHomePage> {
TextEditingController _controller = new TextEditingController();
@override
Widget build(BuildContext context) {
return new Scaffold(
appBar: new AppBar(),
floatingActionButton: new FloatingActionButton(
child: new Icon(Icons.send),
onPressed: () {
setState(() {
// send message
// dismiss on screen keyboard here
_controller.clear();
});
},
),
body: new Container(
alignment: FractionalOffset.center,
padding: new EdgeInsets.all(20.0),
child: new TextFormField(
controller: _controller,
decoration: new InputDecoration(labelText: 'Example Text'),
),
),
);
}
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return new MaterialApp(
home: new MyHomePage(),
);
}
}
void main() {
runApp(new MyApp());
}
Ответы:
Начиная с Flutter v1.7.8 + hotfix.2, можно сделать следующее:
Прокомментируйте PR по этому поводу:
-> НЕ используйте
̶r̶e̶q̶u̶e̶s̶t̶F̶o̶c̶u̶s̶(̶F̶o̶c̶u̶s̶N̶o̶d̶e̶(̶)̶
больше.источник
TextField
s и другими виджетами редактирования). Не знаю почему, но иногдаunfocus
не дает никакого эффекта. Замена на принятое решение (без других изменений) устраняет проблему. Может быть, это связано с местом, откудаunfocus
звонят. Мне нужно вызвать его, например,CheckBoxListTile.onChanged
чтобы закрыть клавиатуру, когда пользователь взаимодействует с виджетом флажка, и из других подобных мест. Я не помню точное местонахождение проблемы.Примечание: этот ответ устарел. См. Ответ для новых версий Flutter .
Вы можете убрать клавиатуру, убрав фокус
TextFormField
и отдав ее неиспользуемымFocusNode
:источник
onChanged:
или в действии вашей пользовательской кнопки?FocusScope.of(context).unfocus()
Решение с FocusScope мне не подходит. Нашел другой:
Это решило мою проблему.
источник
build
метод.Для Flutter 1.17.3 (стабильный канал по состоянию на июнь 2020 г.) используйте
источник
Следующий код помог мне скрыть клавиатуру
источник
Пример реализации .unfocus () для автоматического скрытия клавиатуры при прокрутке списка
вы можете найти на
https://github.com/flutter/flutter/issues/36869#issuecomment-518118441
Благодаря szotp
источник
Ни одно из вышеперечисленных решений не работает для меня.
Flutter предлагает это - поместите свой виджет в новый GestureDetector (), касание которого будет скрывать клавиатуру, а onTap использует FocusScope.of (context) .requestFocus (new FocusNode ())
источник
попробуйте этот жест касания
источник
Поскольку во Flutter все является виджетом, я решил обернуть подход
SystemChannels.textInput.invokeMethod('TextInput.hide');
иFocusScope.of(context).requestFocus(FocusNode());
подход в небольшой служебный модуль с виджетом и миксином в нем.С помощью виджета вы можете обернуть любой виджет (очень удобно при использовании хорошей поддержки IDE) с помощью
KeyboardHider
виджета:С помощью миксина вы можете запустить скрытие клавиатуры из любого состояния или виджета при любом взаимодействии:
Просто создайте
keyboard_hider.dart
файл, и виджет и миксин готовы к использованию:источник
Вы можете использовать
unfocus()
метод изFocusNode
класса.источник
unfocus
метода. Если вы не хотите спамить это в своем приложении, вы можете использовать другой способ, напримерTextFormField
событие изменения или реактивный шаблон, это зависит от архитектуры вашего приложения.Похоже, разные подходы для разных версий. Я использую Flutter v1.17.1, и у меня работает следующее.
источник
источник
Чтобы закрыть клавиатуру (1.7.8 + hotfix.2 и выше), просто вызовите метод ниже:
После того, как метод FocusScope.of (context) .unfocus () уже проверяет, есть ли фокус, прежде чем закрыть клавиатуру, нет необходимости проверять его раньше. Если вам это нужно, просто вызовите другой контекстный метод:
FocusScope.of(context).hasPrimaryFocus
источник
попробуйте использовать контроллер для редактирования текста. в начале,
и на мероприятии для прессы,
это закроет клавиатуру.
источник
Подводя итог, это рабочее решение для Flutter 1.17:
Оберните свой виджет следующим образом:
источник