我们可以在验证后从 Flutter 表单中获取错误字段列表吗?这将帮助开发人员使用焦点节点将注意力重定向到错误的领域。
最佳答案
我认为不可能从 Form
获得此类信息。对象或 FormState
.
但这里有一种方法可以获得你想要的结果(专注于错误的领域):
class _MyWidgetState extends State<MyWidget> {
FocusNode _fieldToFocus;
List<FocusNode> _focusNodes;
final _formKey = GlobalKey<FormState>();
final _numberOfFields = 3;
String _emptyFieldValidator(String val, FocusNode focusNode) {
if (val.isEmpty) {
_fieldToFocus ??= focusNode;
return 'This field cannot be empty';
}
return null;
}
@override
void initState() {
super.initState();
_focusNodes =
List<FocusNode>.generate(_numberOfFields, (index) => FocusNode());
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(actions: [
IconButton(
icon: Icon(Icons.check),
onPressed: () {
if (_formKey.currentState.validate()) {
print('Valid form');
} else {
_fieldToFocus?.requestFocus();
_fieldToFocus = null;
}
},
),
]),
body: Form(
key: _formKey,
child: Column(children: [
...List<TextFormField>.generate(
_numberOfFields,
(index) => TextFormField(
decoration: InputDecoration(hintText: "Field $index"),
focusNode: _focusNodes[index],
validator: (val) => _emptyFieldValidator(val, _focusNodes[index]),
),
),
]),
),
);
}
}
您只需要创建一个 FocusNode
对于您的每一个领域,您都可以调用 requestFocus
在一个精确的领域(在你的情况下被认为是无效的领域)。然后在 validator
表单字段的属性,因为它是 FormState.validate()
调用的方法,您需要设置一个临时变量,该变量将包含正确的 FocusNode
.在我的例子中,我只设置了变量 _fieldToFocus
如果它尚未使用 ??=
分配运算符(operator)。在请求节点上的焦点后,我设置了 _fieldToFocus
返回 null
所以它仍然适用于另一个验证。您可以尝试我在 DartPad 上使用的完整测试代码.
抱歉,如果我从您的问题中得出了一些结论,但我仍然希望这对您有所帮助。
关于 flutter 形式 : Get the list of fields in error,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63833619/