我正在用文本字段构建一个动态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
;)
}
}
这将解决您的问题。将myTextfield
小部件的build
方法中的if
条件替换为以下内容。
if (shouldFocus) {
focusNode.requestFocus();
}
另外,不要忘记通过重写dispose()
方法来处理节点。
_focusNodes.forEach((node){
node.dispose();
});
您在一个无状态小部件上调用setState
,并且您在这里发布的代码中还有一些其他问题。我希望这不是你项目中的代码。必须有所不同。否则它就跑不动了。