IT박스

화면 키보드를 닫으려면 어떻게합니까?

itboxs 2021. 1. 9. 09:39
반응형

화면 키보드를 닫으려면 어떻게합니까?


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()

이에 대한 PR에 대한 의견 :

이제 # 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

반응형