无法使用自定义 FocusNode 将焦点移到 LIstView 项目上

Posted

技术标签:

【中文标题】无法使用自定义 FocusNode 将焦点移到 LIstView 项目上【英文标题】:Can't move focus on LIstView items with custom FocusNodes 【发布时间】:2020-02-27 06:34:53 【问题描述】:

我正在构建一个带有文本字段的动态 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】:

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

if (shouldFocus) 
   focusNode.requestFocus();

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

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

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

【讨论】:

以上是关于无法使用自定义 FocusNode 将焦点移到 LIstView 项目上的主要内容,如果未能解决你的问题,请参考以下文章

无法将焦点移动到 tvOS 中的下一个 UICollectionViewCell

Flutter - 无法在路线之间保持焦点

React-Native:将焦点设置到由数组构建的自定义组件

按下回车键时如何将焦点移到下一个字段?

如何停止将焦点移到 Nativescript (Android) 中的 Enter 按键上?

如何在颤动中将焦点转移到另一个文本表单字段