代码之家  ›  专栏  ›  技术社区  ›  atreeon

颤振/Android-将焦点从下拉按钮移动到文本字段

  •  2
  • atreeon  · 技术社区  · 8 年前

    我在屏幕上有一个文本字段和一个下拉按钮。当我从文本字段选择一个项目,然后回到文本字段时,我发现这有点尴尬。

    1. 在文本字段中键入
    2. 轻触下拉菜单两次,选择下拉菜单

    我的问题是,你必须点击两次,一次退出文本字段,第二次访问下拉列表-有没有办法在一次点击中退出文本字段并打开下拉列表?这是内置在Android还是颤振控制中?

    下面是一些显示下拉列表和文本框的颤振代码。。。

    class _TextAndDropdownState extends State<TextAndDropdown> {
      int selectedDropdown;
      String selectedText;
      final textController = new TextEditingController();
    
      @override
      void initState() {
        super.initState();
    
        selectedDropdown = 1;
    
        textController.addListener(() => print(''));
      }
    
      @override
      Widget build(BuildContext context) {
        return new Scaffold(
          appBar: new AppBar(
            title: new Text('Text and dropdown'),
          ),
          body: Container(
            child: Column(
              children: [
                Padding(
                  padding: EdgeInsets.all(10.0),
                ),
                DropdownButton(value: selectedDropdown, onChanged: _dropdownChange, items: [
                  DropdownMenuItem(
                    child: Text('First'),
                    value: 1,
                  ),
                  DropdownMenuItem(child: Text('Seconds')),
                ]),
                TextField(controller: textController),
              ],
            ),
          ),
        );
      }
    
      void _dropdownChange(val) {
        setState(() {
          selectedDropdown = val;
        });
      }
    }
    
    1 回复  |  直到 7 年前
        1
  •  31
  •   Abir Ahsan    5 年前

    很抱歉回答得太晚。。。我也在寻找解决方案。现在我明白了。

    只有你必须添加这个

     FocusScope.of(context).requestFocus(new FocusNode());
    

    在您的

    _dropdownChange(val) 方法

    void _dropdownChange(val) {
                          FocusScope.of(context).requestFocus(new FocusNode());///It will clear all focus of the textfield
                setState(() {
                  selectedDropdown = val;
                         });
                               }
    

    also refer Abdul Wahab answer

        2
  •  3
  •   moshyfawn    6 年前

    目前,Flatter GitHub回购协议中有一个关于此问题的持续问题。目前还没有解决,但有一个方便的解决方法 this comment 暗示。

    您可以添加 FocusManager.instance.primaryFocus.unfocus(); onTap() 您的下拉按钮应该“窃取”的事件集中在以前集中在下拉点击上的文本字段之外。

        3
  •  2
  •   Abdul Wahab    6 年前

    @Ditest的答案是正确的,但在这个用例中仍然存在一个问题,即当用户点击下拉菜单的外部,然后文本字段重新聚焦并打开键盘。我解决这个问题的方法是在DropDownButton的onTap侦听器中添加以下代码

    FocusScope.of(context).requestFocus(new FocusNode()); ///它将清除文本字段的所有焦点

        4
  •  0
  •   yevbe    5 年前

    另一种方法是创建 FocusNode (在我的例子中,下拉小部件被设置为在有焦点时显示一个特定的小部件,这就是最终对我有效的地方)。

    所以创建一个 焦点节点 变量

    final FocusNode _focusNode = FocusNode();
    

    在您的 Dropdown widget,设置 focusNode 到您刚刚创建的

    然后终于进来了 onChanged() ,请执行此操作。。。

    onChanged: (String? newValue) {
      FocusScope.of(context).requestFocus(_focusNode);
        setState(() {
          dropdownValue = newValue!;
        });
    },