vzu*_*urd 5 flutter flutter-form-builder
我们能否在验证后从 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]),
),
),
]),
),
);
}
}
Run Code Online (Sandbox Code Playgroud)
您只需FocusNode为每个字段创建一个,这样您就可以调用requestFocus精确的字段(在您的情况下,该字段被视为无效)。然后在validator表单字段的属性中,因为它是 调用的方法FormState.validate(),所以您需要设置一个临时变量,其中将包含正确的FocusNode. 在我的示例中,我仅_fieldToFocus在尚未使用??=运算符分配变量时才设置该变量。在请求将焦点放在我设置的节点_fieldToFocus上之后null,它仍然可以用于另一次验证。
您可以尝试我在DartPad上使用的完整测试代码。
抱歉,如果我从你的问题中得出了一些结论,但我仍然希望这会对你有所帮助。
| 归档时间: |
|
| 查看次数: |
2690 次 |
| 最近记录: |