无法通过自定义FocusNode将焦点移至LIstView项目

时间:2019-10-31 21:05:30

标签: flutter dart

我正在使用文本字段构建动态ListView。每次用户单击按钮时,我都会添加一个文本字段,并且该文本字段会获得焦点,而先前的文本字段会失去焦点。但是,发生错误,导致我无法通过单击另一个文本字段来使文本字段失去焦点。而且,我无法关闭键盘。如果单击另一个文本字段,焦点将移至该文本字段一秒钟,然后又回到原始文本字段。无论我在屏幕上的哪个位置(另一个文本字段或按钮),都无法移动焦点。

class myOptions extends StatelessWidget {
    final List<FocusNode> _focusNodes = [];
    int optionCount = 0;

    void addOption () {
        final FocusNode _node = FocusNode();
        setState(() {
            optionCount = optionCount + 1;
            _focusNodes.add(_node);
        });
    }

    Widget build(BuildContext context) {
        return ListView.builder(
            shrinkwrap: true,
            primary: false,
            itemCount: optionCount,
            itemBuilder: (BuildContext context, int index) {
                return myTextfield(
                    focusNode: _focusNodes[index],
                    shouldFocus: options == (index + 1)
                );
            }
        );
    }
}

class myTextfield extends StatelessWidget {
    final FocusNode focusNode;
    final bool shouldFocus;

    myTextfield({this.focusNode,this.shouldFocus});

    Widget build(BuildContext context) {
        if (shouldFocus) {
            FocusScope.of(context).requestFocus(focusNode);
        }

        return TextField(
            focusNode: focusNode
        ;)
    }
}

1 个答案:

答案 0 :(得分:0)

这将解决您的问题。将if小部件的myTextfield方法中的build条件替换为以下内容。

if (shouldFocus) {
   focusNode.requestFocus();
}

也不要忘记通过覆盖dispose()方法来放置节点。

_focusNodes.forEach((node){
   node.dispose();
});

您正在调用无状态小部件上的setState,并且您在此处发布的代码中还有其他一些问题。我希望这不是您项目中的代码。它必须是不同的。否则它将无法运行。