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

quy*_*ong 20 flutter flutter-layout

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

这是我想要的

这是我的问题

Kar*_*ren 56

要隐藏键盘,并保持光标可见,设置readOnlytrueshowCursortrue

TextFormField(
  showCursor: true,
  readOnly: true),
Run Code Online (Sandbox Code Playgroud)

颤振/问题/#16863


Vir*_*ral 20

仅供参考,TextInputType.none 是在#83974中引入的:

TextField( 键盘类型: TextInputType.none, ... )


小智 7

您可以使用自定义 focusNode

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

TextField(focusNode: FirstDisabledFocusNode(),)

class FirstDisabledFocusNode extends FocusNode {
  @override
  bool consumeKeyboardToken() {
    return false;
  }
}
Run Code Online (Sandbox Code Playgroud)

这始终可以防止:

TextField(focusNode: AlwaysDisabledFocusNode())

class AlwaysDisabledFocusNode extends FocusNode {
  @override
  bool get hasFocus => false;
}
Run Code Online (Sandbox Code Playgroud)


And*_*sky 3

插入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;
  }
}
Run Code Online (Sandbox Code Playgroud)