Flutter / Android-将焦点从下拉按钮移至textField

时间:2018-07-26 08:21:49

标签: flutter

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

  1. 在文本字段中输入
  2. 通过点击两次来选择下拉列表

我的问题是您必须轻按两次,一次退出文本字段,第二次访问下拉菜单-是否有一种方法可以退出文本字段并一键打开下拉列表?这是内置于Android还是Flutter控件?

以下是一些浮动代码,它们显示一个下拉列表和一个文本框...

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

4 个答案:

答案 0 :(得分:2)

扑朔迷离的GitHub存储库中目前存在一个有关此问题的持续性问题。尚未解决,但this comment暗示有一个方便的解决方法。

您可以将FocusManager.instance.primaryFocus.unfocus();添加到DropdownButton的onTap()事件中,该事件应“窃取”焦点,使其脱离先前集中于下拉水龙头的TextField。

答案 1 :(得分:1)

对不起,您的回答很晚...我也在寻找解决方案。现在我明白了。

只需添加此内容

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

在您的

_dropdownChange(val)方法

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

答案 2 :(得分:1)

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

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

答案 3 :(得分:0)

另一种方法是创建一个 FocusNode。 (在我的例子中,Dropdown 小部件设置为在它有焦点时显示特定的,这最终对我来说效果很好)。

所以创建一个 FocusNode 变量...

final FocusNode _focusNode = FocusNode();

在您的 Dropdown 小部件中,将 focusNode 设置为您刚刚创建的那个

最后在 onChanged() 中,执行此操作...

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