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

问题描述 投票:0回答:6

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

这就是我想要的

这是我的问题

flutter flutter-layout
6个回答
93
投票

要隐藏键盘并保持光标可见,请将

readOnly
设置为
true
,并将
showCursor
设置为
true

TextFormField(
  showCursor: true,
  readOnly: true),

参见 flutter/issues/#16863


27
投票

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

文本字段( 键盘类型:TextInputType.none, ... )


11
投票

您可以使用自定义焦点节点

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

TextField(focusNode: FirstDisabledFocusNode(),)

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

这总是可以防止:

TextField(focusNode: AlwaysDisabledFocusNode())

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

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;
  }
}

1
投票

尝试使用

input_with_keyboard_control

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


0
投票
 TextField(
         obscureText: true, // Mask the input text
         keyboardType: TextInputType.emailAddress, //make it emailAddress type
            )

将键盘类型设置为电子邮件地址,这将避免手机弹出安全键盘

© www.soinside.com 2019 - 2024. All rights reserved.