flutter - 如何比较 2 TextFormField 中的值
问题描述
我希望验证 2TextFormField
秒内的值是否匹配。
我可以单独验证它们。
但是我如何通过比较来捕获这两个值来验证呢?
import 'package:flutter/material.dart';
class RegisterForm extends StatefulWidget {
@override
_RegisterFormState createState() => _RegisterFormState();
}
class _RegisterFormState extends State<RegisterForm> {
final _formKey = GlobalKey<FormState>();
@override
Widget build(BuildContext context) {
return Form(
key: _formKey,
child: Stack(
children: [
Container(
padding: EdgeInsets.all(20),
height: double.infinity,
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
TextFormField(
decoration: InputDecoration(
hintText: 'Password'
),
validator: (value) {
// I want to compare this value against the TextFormField below.
if(value.isEmpty){
return 'is empty';
}
return value;
},
),
TextFormField(
decoration: InputDecoration(
hintText: 'Confirm Password'
),
validator: (value) {
if(value.isEmpty){
return 'is empty';
}
return value;
},
),
RaisedButton(
onPressed: (){
if (_formKey.currentState.validate()) {
print('ok');
} else {
print('not ok');
}
},
),
],
),
)
],
),
);
}
}
一种可能的解决方案如下。
我可以将它们作为值存储在块中_RegisterFormState
并在块中检索它们validate
。但是有没有更清洁的方法来实现这一目标?
class _RegisterFormState extends State<RegisterForm> {
final _formKey = GlobalKey<FormState>();
String password;
String confirmPassword;
.....
TextFormField(
decoration: InputDecoration(
hintText: 'Password'
),
validator: (value) {
// I want to compare this value against the TextFormField below.
if(value.isEmpty){
setState(() {
password = value;
});
performValidation(password, confirmPassword); // some custom validation method
return 'is empty';
}
return value;
},
),
.....
}
PS:如果有更好的方法通过状态管理工具来做到这一点,我正在使用Provider
. 不是在寻找 Bloc 解决方案。
解决方案
我已经执行了几个步骤来实现这一点。你可以参考它来实现你的目标。
创建一个有状态的小部件并从那里返回一个 InputBox
添加一个名为回调的属性并将其数据类型设置为
值设置器回调;
将此回调分配给输入框的 onChanged 事件
onChanged: (text) { widget.callback(text); },
在要使用输入框的类中使用自定义小部件
在使用您的小部件时将回调传递给它
InputWithLabel( callback: (value) { password = value; }, ), InputWithLabel( callback: (value) { confirmPassword = value; }, ),
最后,我们必须比较这些值,您可以将一个键绑定到您的表单,并在保存的事件中使用它。您可以将其包装在 Button 的回调中
if (InputValidation.validatePasswordandConfirm(password, cpassword)) { // your after form code }
要让它实时比较,请在 setState(){} 中标记输入回调之一,并在您的自定义文本小部件中创建一个名为 compareTxt 的新属性;
并在验证器上检查比较文本并返回错误消息
validator: (text) {
if (widget.comaparetext != text) {
return 'Password does not match';
}
推荐阅读
- c# - 无法设置 char 类型的数组等于逗号?
- c# - 如何在组合框中使用“foreach”
- sql - 表中的 SQL 计数
- c# - 根据特定条件添加Xelement c#
- c++ - 在结构中添加 n 枚举命名空间时出错
- c# - 生成所有长度为 M (1
感谢您抽出时间来阅读。我正在做一个更大的项目,该项目需要一个根据标题中描述的规则生成所有数字的函数。如果输入为 M=3 且 N=5 输出应为:111,112,113,114,115,121....555 对于输入 M=4 且 N=2 输出应为:1111,1112,1121...2222
很长一
- node.js - 皮诺转运蛋白和 PM2
- bash - Compute Engine 在实例启动时启动节点服务器
- javascript - Ajax / JQuery - 成功时显示闪存消息
- swift - viewDidLayoutSubviews() 问题