화면 키보드를 닫으려면 어떻게합니까?
a로 사용자 입력을 수집 TextFormField
하고 있으며 사용자 FloatingActionButton
가 완료되었음을 나타내는 a 를 누르면 화면 키보드를 닫고 싶습니다.
키보드가 자동으로 사라지도록하려면 어떻게합니까?
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());
}
의 포커스 TextFormField
를 제거하고 사용하지 않는 사용자에게 제공 하여 키보드를 닫을 수 있습니다 FocusNode
.
FocusScope.of(context).requestFocus(FocusNode());
FocusScope 솔루션이 작동하지 않습니다. 다른 것을 찾았습니다.
import 'package:flutter/services.dart';
SystemChannels.textInput.invokeMethod('TextInput.hide');
그것은 내 문제를 해결했습니다.
Flutter v1.7.8 + hotfix.2 현재 방법은 다음과 같습니다.
FocusScope.of(context).unfocus()
이제 # 31909 (be75fb3)가 도착 했으므로 FocusScope.of (context) .requestFocus (FocusNode ()) 대신 FocusScope.of (context) .unfocus ()를 사용해야합니다.
위의 솔루션 중 어느 것도 나를 위해 작동하지 않습니다.
Flutter는 이것을 제안합니다- 탭이 키보드를 숨기고 onTap이 FocusScope.of (context) .requestFocus (new FocusNode ())를 사용하는 새 GestureDetector () 안에 위젯을 넣습니다.
class Home extends StatelessWidget {
@override
Widget build(BuildContext context) {
var widget = new MaterialApp(
home: new Scaffold(
body: new Container(
height:500.0,
child: new GestureDetector(
onTap: () {
FocusScope.of(context).requestFocus(new FocusNode());
},
child: new Container(
color: Colors.white,
child: new Column(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
new TextField( ),
new Text("Test"),
],
)
)
)
)
),
);
return widget;
}}
클래스의 unfocus()
메소드를 사용할 수 있습니다 FocusNode
.
import 'package:flutter/material.dart';
class MyHomePage extends StatefulWidget {
MyHomePageState createState() => new MyHomePageState();
}
class MyHomePageState extends State<MyHomePage> {
TextEditingController _controller = new TextEditingController();
FocusNode _focusNode = new FocusNode(); //1 - declare and initialize variable
@override
Widget build(BuildContext context) {
return new Scaffold(
appBar: new AppBar(),
floatingActionButton: new FloatingActionButton(
child: new Icon(Icons.send),
onPressed: () {
_focusNode.unfocus(); //3 - call this method here
},
),
body: new Container(
alignment: FractionalOffset.center,
padding: new EdgeInsets.all(20.0),
child: new TextFormField(
controller: _controller,
focusNode: _focusNode, //2 - assign it to your TextFormField
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에서 모든 것이 위젯이므로 위젯과 믹스 인이 포함 된 짧은 유틸리티 모듈에 SystemChannels.textInput.invokeMethod('TextInput.hide');
및 FocusScope.of(context).requestFocus(FocusNode());
접근 방식 을 래핑하기로 결정 했습니다.
위젯을 사용하면 위젯으로 모든 위젯 (좋은 IDE 지원을 사용할 때 매우 편리함)을 래핑 할 수 있습니다 KeyboardHider
.
class SimpleWidget extends StatelessWidget {
@override
Widget build(BuildContext context) {
return KeyboardHider(
/* Here comes a widget tree that eventually opens the keyboard,
* but the widget that opened the keyboard doesn't necessarily
* takes care of hiding it, so we wrap everything in a
* KeyboardHider widget */
child: Container(),
);
}
}
mixin을 사용하면 상호 작용시 모든 상태 또는 위젯에서 키보드 숨기기를 트리거 할 수 있습니다.
class SimpleWidget extends StatefulWidget {
@override
_SimpleWidgetState createState() => _SimpleWidgetState();
}
class _SimpleWidgetState extends State<SimpleWidget> with KeyboardHiderMixin {
@override
Widget build(BuildContext context) {
return RaisedButton(
onPressed: () {
// Hide the keyboard:
hideKeyboard();
// Do other stuff, for example:
// Update the state, make an HTTP request, ...
},
);
}
}
keyboard_hider.dart
파일을 생성하기 만하면 위젯과 믹스 인을 사용할 수 있습니다.
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
/// Mixin that enables hiding the keyboard easily upon any interaction or logic
/// from any class.
abstract class KeyboardHiderMixin {
void hideKeyboard({
BuildContext context,
bool hideTextInput = true,
bool requestFocusNode = true,
}) {
if (hideTextInput) {
SystemChannels.textInput.invokeMethod('TextInput.hide');
}
if (context != null && requestFocusNode) {
FocusScope.of(context).requestFocus(FocusNode());
}
}
}
/// A widget that can be used to hide the text input that are opened by text
/// fields automatically on tap.
///
/// Delegates to [KeyboardHiderMixin] for hiding the keyboard on tap.
class KeyboardHider extends StatelessWidget with KeyboardHiderMixin {
final Widget child;
/// Decide whether to use
/// `SystemChannels.textInput.invokeMethod('TextInput.hide');`
/// to hide the keyboard
final bool hideTextInput;
final bool requestFocusNode;
/// One of hideTextInput or requestFocusNode must be true, otherwise using the
/// widget is pointless as it will not even try to hide the keyboard.
const KeyboardHider({
Key key,
@required this.child,
this.hideTextInput = true,
this.requestFocusNode = true,
}) : assert(child != null),
assert(hideTextInput || requestFocusNode),
super(key: key);
@override
Widget build(BuildContext context) {
return GestureDetector(
behavior: HitTestBehavior.opaque,
onTap: () {
hideKeyboard(
context: context,
hideTextInput: hideTextInput,
requestFocusNode: requestFocusNode,
);
},
child: child,
);
}
}
다음 코드는 키보드를 숨기는 데 도움이되었습니다.
void initState() {
SystemChannels.textInput.invokeMethod('TextInput.hide');
super.initState();
}
_dismissKeyboard(BuildContext context) {
FocusScope.of(context).requestFocus(new FocusNode());
}
@override
Widget build(BuildContext context) {
return new GestureDetector(
onTap: () {
this._dismissKeyboard(context);
},
child: new Container(
color: Colors.white,
child: new Column(
children: <Widget>[/*...*/],
),
),
);
}
ReferenceURL : https://stackoverflow.com/questions/44991968/how-can-i-dismiss-the-on-screen-keyboard
'IT박스' 카테고리의 다른 글
django.forms에 TextField가 없습니다. (0) | 2021.01.10 |
---|---|
Windows 7 Git Bash에서 현재 위치에서 디렉터리를 탐색하는 방법이 있습니까? (0) | 2021.01.09 |
C #의 메모리 누수 (0) | 2021.01.09 |
코드에서 동적 리소스 스타일을 할당하는 방법은 무엇입니까? (0) | 2021.01.09 |
최대 너비를 사용하여 CSS에서 비례 적으로 이미지 크기 조정 (0) | 2021.01.09 |