【问题标题】:disabling keyboard pop up when pressing clear() button按下 clear() 按钮时禁用键盘弹出
【发布时间】:2021-08-11 23:33:54
【问题描述】:

我有一堆输入字段,它们逐行占据整个屏幕,最后我有“x”图标来清除输入字段。虽然一切正常,但有点笨拙,因为每次按下清除图标时,键盘都会弹出并占据手机屏幕一半以上的空间(我只是希望它在点击清除按钮后保持自己的)。

在尝试解决我的问题时,我尝试使用 GestureDetector 和我发现的其他几个选项来解决这个问题,但没有找到任何可行的方法。

这是一段代码,其中定义了 onPressed 以查看发生了什么。您只需输入一些信息,然后用“x”图标清除它,该图标在调用 onPressed 时触发。我不确定是否有办法结合执行 FocusScope.of(context).requestFocus(FocusNode() );执行 dateController.clear() 后

          TextFormField(

            controller: dateController,
            validator: (value){
              if(value.isEmpty){
                return "Enter Valid Feedback";
              }else{
                return null;
              }
            },
            decoration: InputDecoration(
              hintText: "Datum",
              suffixIcon: IconButton(
                onPressed: () => dateController.clear(),

                icon: Icon(Icons.clear),
              ),
            ),
          ),

【问题讨论】:

    标签: flutter


    【解决方案1】:

    您可以通过在您的情况下使用Stack 来实现我们在html 中习惯的stopPropogation 效果。

    这样,

    Stack(children: [
      TextFormField(
        controller: dateController,
        validator: (value) {
          if (value.isEmpty) {
            return "Enter Valid Feedback";
          } else {
            return null;
          }
        },
        decoration: InputDecoration(
          hintText: "Datum",
        ),
      ),
      Align(
        alignment: Alignment.centerRight,
        child: IconButton(
          onPressed: () {
            dateController.clear();
          },
          icon: Icon(Icons.clear),
        ),
      ),
    ]),
    

    由于您的 IconButton 现在位于 Stack 中,因此您的 TextFormField 不会注册该事件。

    【讨论】:

    • 猜猜这可行,但我不想重构我的大部分代码。我想,如果我找不到更优雅的解决方案,我会选择你的。跨度>
    • 当然@user14584183。如果发现更优雅的东西,我会对其进行一些研究并回复您。如果您最终接受这个答案,请考虑接受答案。
    • 来自文档There is no mechanism for canceling or stopping pointer events from being dispatched further. 所以使用StackRow 似乎是唯一的解决方案。
    【解决方案2】:

    您可以使用自定义FocusNode 来控制输入字段的焦点。如需参考,请查看此 URL:https://flutter.dev/docs/cookbook/forms/focus。您必须为 TextField 设置自定义 FocusNode,并在按下清除按钮时调用 unfocus() 方法。

    【讨论】:

    • 真的不行,因为它只是一直在改变状态,我试过onPressed: () => [dateController.clear(), FocusScope.of(context).unfocus()], .. 但是,我有多个输入字段,它只是更改所有 itme 的状态并弹出键盘以及我尝试清除的下一个文本字段。例如,我将在日期输入字段上按清除,它将禁用键盘弹出,但在下一个文本字段上,我按清除它将再次聚焦。
    【解决方案3】:
    dateController.clear();
    FocusManager.instance.primaryFocus.unfocus();
    

    在真正的 android 设备上为我工作(未在模拟器中测试)

    【讨论】:

    • 工作原理与 FocusScope.of(context).unfocus(); 相同,但只有当您单击要清除的给定文本字段时才有效。在我自己的示例中,我有日期输入字段,然后是帖子编号输入字段等。如果我在帖子编号输入字段上并按下按钮以清除日期输入字段,则它不起作用。如果我在帖子编号输入字段上处于活动状态并按下按钮清除它可以工作,但这不是我想要的。即使我没有在同一个输入字段上处于活动状态,我也希望它能够工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-09-15
    • 1970-01-01
    • 2015-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多