我正在使用文本字段构建动态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
;)
}
}
答案 0 :(得分:0)
这将解决您的问题。将if
小部件的myTextfield
方法中的build
条件替换为以下内容。
if (shouldFocus) {
focusNode.requestFocus();
}
也不要忘记通过覆盖dispose()
方法来放置节点。
_focusNodes.forEach((node){
node.dispose();
});
您正在调用无状态小部件上的setState
,并且您在此处发布的代码中还有其他一些问题。我希望这不是您项目中的代码。它必须是不同的。否则它将无法运行。