Flutter如何在单击TextField时始终隐藏键盘但保持焦点(保持显示光标)

时间:2019-03-19 05:12:52

标签: flutter flutter-layout

我无法控制键盘的显示或隐藏,在我的项目中,我需要始终隐藏键盘,但要始终专注于显示我的自定义键盘(小部件)。

需要帮助!!!

This is I want

And this is my problem

4 个答案:

答案 0 :(得分:27)

要隐藏键盘并保持光标可见,请将readOnly设置为true,将showCursor设置为true

TextFormField(
  showCursor: true,
  readOnly: true),

请参见flutter/issues/#16863

答案 1 :(得分:1)

尝试使用 input_with_keyboard_control

它帮助我解决了从条码扫描仪接收文本而不显示键盘的问题

答案 2 :(得分:0)

插入NoKeyboardEditableText代替您的TextField

class NoKeyboardEditableText extends EditableText {

  NoKeyboardEditableText({
    @required TextEditingController controller,
    TextStyle style = const TextStyle(),
    Color cursorColor = Colors.black,
    bool autofocus = false,
    Color selectionColor
  }):super(
      controller: controller,
      focusNode: NoKeyboardEditableTextFocusNode(),
      style: style,
      cursorColor: cursorColor,
      autofocus: autofocus,
      selectionColor: selectionColor,
      backgroundCursorColor: Colors.black
  );

  @override
  EditableTextState createState() {
    return NoKeyboardEditableTextState();
  }

}

class NoKeyboardEditableTextState extends EditableTextState {

  @override
  Widget build(BuildContext context) {
    Widget widget = super.build(context);
    return Container(
      decoration: UnderlineTabIndicator(borderSide: BorderSide(color: Colors.blueGrey)),
      child: widget,
    );
  }

  @override
  void requestKeyboard() {
    super.requestKeyboard();
    //hide keyboard
    SystemChannels.textInput.invokeMethod('TextInput.hide');
  }
}

class NoKeyboardEditableTextFocusNode extends FocusNode {
  @override
  bool consumeKeyboardToken() {
    // prevents keyboard from showing on first focus
    return false;
  }
}

答案 3 :(得分:0)

您可以使用自定义focusNode

这可以防止仅在第一次点击时出现键盘:

TextField(focusNode: FirstDisabledFocusNode(),)

class FirstDisabledFocusNode extends FocusNode {
  @override
  bool consumeKeyboardToken() {
    return false;
  }
}

这总是防止:

TextField(focusNode: AlwaysDisabledFocusNode())

class AlwaysDisabledFocusNode extends FocusNode {
  @override
  bool get hasFocus => false;
}