无法使用自定义 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
React-Native:将焦点设置到由数组构建的自定义组件