Flutter 如何在不显示键盘的情况下聚焦文本字段?

Flutter 如何在不显示键盘的情况下聚焦文本字段?,flutter,dart,Flutter,Dart,我需要关注文本字段,但不显示键盘。 只有当用户点击文本字段时,才需要显示键盘 我试了两种方法 第一次尝试: 这样键盘就显示出来了,但在屏幕构建之后它就隐藏了,这不好看 建造商: GestureDetector( onTap: () { SystemChannels.textInput.invokeMethod('TextInput.show'); }, child: TapOnlyFocusTextField( controller: ba

我需要关注文本字段,但不显示键盘。 只有当用户点击文本字段时,才需要显示键盘

我试了两种方法

第一次尝试: 这样键盘就显示出来了,但在屏幕构建之后它就隐藏了,这不好看

建造商:

GestureDetector(
    onTap: () {
        SystemChannels.textInput.invokeMethod('TextInput.show');
    },
    child: TapOnlyFocusTextField(
        controller: barcodeStringController,
        focusNode: myFocusNode, //this is a TapOnlyFocusTextFieldFocusNode
        textAlign: TextAlign.right,
        textInputAction: TextInputAction.done,
        textCapitalization: TextCapitalization.characters,
        style: TextStyle(fontSize: 20),
        cursorColor: Colors.black,
        //... Other event listeners to handle submit
    ),
),
TextFormField(
控制器:条形码控制器,
focusNode:myFocusNode,
自动对焦:对,
textAlign:textAlign.right,
textInputAction:textInputAction.done,
textcapitalize:textcapitalize.characters,
样式:TextStyle(字体大小:20),
maxLines:null,
onTap:(){
SystemChannel.textInput.invokeMethod('textInput.show');
},
//…要处理提交的其他事件侦听器
),
和外部构建():

void\u onAfterBuild(BuildContext){
SystemChannel.textInput.invokeMethod('textInput.hide');
}
第二次尝试: 这样,键盘隐藏在一个较低的层次,它是更好地看到。问题是从来没有调用过onTap,所以键盘永远不会显示,onTap也不会显示

建造商:

GestureDetector(
    onTap: () {
        SystemChannels.textInput.invokeMethod('TextInput.show');
    },
    child: TapOnlyFocusTextField(
        controller: barcodeStringController,
        focusNode: myFocusNode, //this is a TapOnlyFocusTextFieldFocusNode
        textAlign: TextAlign.right,
        textInputAction: TextInputAction.done,
        textCapitalization: TextCapitalization.characters,
        style: TextStyle(fontSize: 20),
        cursorColor: Colors.black,
        //... Other event listeners to handle submit
    ),
),
TapOnlyFocusTextField类:

class TapOnlyFocusTextField extends EditableText {
  TapOnlyFocusTextField({
    @required TextEditingController controller,
    @required TextStyle style,
    @required Color cursorColor,
    bool autofocus = false,
    Color selectionColor,
    FocusNode focusNode,
    TextAlign textAlign,
    TextInputAction textInputAction,
    TextCapitalization textCapitalization,
    onSubmitted,
    onChanged,
  }) : super(
          controller: controller,
          focusNode: focusNode,
          style: style,
          cursorColor: cursorColor,
          autofocus: autofocus,
          selectionColor: selectionColor,
          textAlign: textAlign,
          textInputAction: textInputAction,
          textCapitalization: textCapitalization,
          maxLines: null,
          onSubmitted: onSubmitted,
          backgroundCursorColor: Colors.black,
          onChanged: onChanged,
        );

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

class TapOnlyFocusTextFieldState extends EditableTextState {
  @override
  void requestKeyboard() {
    super.requestKeyboard();
    //hide keyboard
    SystemChannels.textInput.invokeMethod('TextInput.hide');
  }
}
TapOnlyFocusTextFieldFocusNode类:

class TapOnlyFocusTextFieldFocusNode extends FocusNode {
  @override
  bool consumeKeyboardToken() {
    // prevents keyboard from showing on first focus
    return false;
  }
}
我知道在Flatter Github中已经有一个公开的问题,但我需要找到一个解决方案:

文本\u input.dart有一个方法

    void show({bool ifShowKeyBoard = true}) {
      assert(attached);
      if (ifShowKeyBoard) {
        TextInput._instance._show();
      }
    }
我改变了方法,如下所示:

但我更喜欢在这种状态下:

  void initState() {
    super.initState();
    Future.delayed(
      Duration(),
      () => SystemChannels.textInput.invokeMethod('TextInput.hide'),
    );
  }

不要忘记将“自动对焦”设置为true。

您确定从不调用
手势检测器
onTap
(例如,您是否添加了打印语句)?轻触事件向下传递到树中,因此
GestureDetector
应该首先使用它。我可能知道一个解决办法,但我对此感到困惑。另外,您是否测试过其他
手势检测器
回调?这可能不是您想要的行为,但如果长按文本字段会触发手势检测器长按,则会显示有用的信息。@CreativeCreatorMorMaybeno是的,没有调用onTap或onLongPress第二次尝试中的问题是没有调用GestureDetector onTap。我试着创建一个按钮来显示键盘,它工作正常。经过进一步的调查,我发现onTap被调用了,但不是每次都被调用(这真的很奇怪),我不知道为什么。