- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我创建了 Form
这种形式的小部件有多个 TextFormFeild
我创建了自定义 BoxFeild
.我面临与 相关的问题auto-validation
来自表单小部件。无法验证确认密码中的密码匹配字段 BoxFeild
我应该 validate password
保存在中的formKeyData后匹配current state
?
将 key 传递给 BoxFeild
时遇到问题构造函数。它的显示多个小部件使用相同的全局键。
我需要添加全局 FormFeild 键来比较 _password
和 _confirmPassword
.
class _PageSignUpState extends State<PageSignUp> {
final GlobalKey<FormState> _formKey = GlobalKey<FormState>();
var passKey = GlobalKey<FormFieldState>();
bool _autoValidate = false;
String _name, _email, _phoneNo, _password, _confirmPassoword;
bool isLoading = false;
final _passwordController = TextEditingController();
final _confirmPassController = TextEditingController();
double width,height;
@override
Widget build(BuildContext context) {
width = MediaQuery.of(context).size.width;
height = MediaQuery.of(context).size.height;
return Scaffold(
backgroundColor: Colors.white,
body: Container(
color: Colors.grey.shade200,
child: Center(
child: SingleChildScrollView(
child: Container(
child: Column(
children: <Widget>[
Form(
key: _formKey,
autovalidate: _autoValidate,
child: Column(
children: <Widget>[
_nameWidget(),
_emailWidget(),
_passwordWidget(),
_confirmPassWidget(),
SizedBox(height: height/25),
_signUpButtonWidget()
],
)),
],
),
),
),
),
),
);
}
Container _signUpButtonWidget() {
return Container(
padding: EdgeInsets.symmetric(vertical: height / 40, horizontal: width / 15),
width: double.infinity,
child: RaisedButton(
padding: EdgeInsets.all(12.0),
child: Text(
"Sign Up",
style: TextStyle(color: Colors.white, fontSize: 20.0),
),
color: Colors.blue,
onPressed: () {
setLoading(true);
_validateInputs();
},
),
);
}
BoxFeild _confirmPassWidget() {
return BoxFeild(
hintText: "Confirm Password",
lableText: "Confirm Password",
obscureText: true,
icon: Icons.lock_outline,
validator: validatePasswordMatching,
onSaved: (String val) {
_confirmPassoword = val;
},
);
}
BoxFeild _passwordWidget() {
return BoxFeild(
key: passKey,
hintText: "Enter Password",
lableText: "Password",
obscureText: true,
icon: Icons.lock_outline,
controller: _passwordController,
validator: validatePassword,
onSaved: (String val) {
_password = val;
},
);
}
BoxFeild _emailWidget() {
return BoxFeild(
hintText: "Enter Email",
lableText: "Email",
keyboardType: TextInputType.emailAddress,
icon: Icons.email,
validator: validateEmail,
onSaved: (String val) {
_email = val;
},
);
}
BoxFeild _nameWidget() {
return BoxFeild(
hintText: "Enter Name",
lableText: "Name",
icon: Icons.person,
validator: validateName,
onSaved: (String val) {
_name = val;
},
);
}
String validateName(String value) {
String patttern = r'(^[a-zA-Z ]*$)';
RegExp regExp = RegExp(patttern);
if (value.length == 0) {
return "Name is Required";
} else if (!regExp.hasMatch(value)) {
return "Name must be a-z and A-Z";
}
return null;
}
String validateEmail(String value) {
RegExp regExp = RegExp(Constants.PATTERN_EMAIL, caseSensitive: false);
if (value.length == 0) {
return "Email is Required";
} else if (!regExp.hasMatch(value)) {
return "Enter valid email address.";
}
return null;
}
String validatePassword(String value) {
if (value.length == 0) {
return "Password is Required";
} else if (value.length < 6) {
return "Password Should be more than 6.";
}
return null;
}
String validatePasswordMatching(String value) {
var password = passKey.currentState.value;
if (value.length == 0) {
return "Password is Required";
} else if (value != password) {
return 'Password is not matching';
}
return null;
}
void _validateInputs() {
if (_formKey.currentState.validate()) {
//If all data are correct then save data to out variables
//Make a REST Api Call with success Go to Login Page after User Created.
_formKey.currentState.save();
setLoading(true);
Utils.checkConnection().then((connectionResult) {
if (connectionResult) {
} else {
setLoading(false);
Utils.showAlert(context, "Flutter",
"Internet is not connected. Please check internet connection.",
() {
Navigator.pop(context);
}, true);
}
});
}
} else {
// If all data are not valid then start auto validation.
setState(() {
_autoValidate = true;
});
}
}
}
BoxFeild.dart
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
class BoxFeild extends StatefulWidget {
final TextEditingController controller;
final FocusNode focusNode;
final TextInputType keyboardType;
final TextInputAction textInputAction;
final TextCapitalization textCapitalization;
final TextStyle style;
final TextAlign textAlign;
final bool autofocus;
final bool obscureText;
final bool autocorrect;
final int maxLines;
final Key key;
final int maxLength;
final bool maxLengthEnforced;
final ValueChanged<String> onChanged;
final VoidCallback onEditingComplete;
final ValueChanged<String> onSubmitted;
final List<TextInputFormatter> inputFormatters;
final bool enabled;
final IconData icon;
final String hintText;
final String lableText;
final double cursorWidth;
final Radius cursorRadius;
final Color cursorColor;
final Color defaultBorderColor;
final Brightness keyboardAppearance;
final EdgeInsets scrollPadding;
final FormFieldValidator<String> validator;
final ValueChanged<String> onFieldSubmitted;
final FormFieldSetter<String> onSaved;
const BoxFeild({
this.key,
this.controller,
this.focusNode,
TextInputType keyboardType,
this.textInputAction,
this.textCapitalization = TextCapitalization.none,
this.style,
this.icon,
this.textAlign = TextAlign.start,
this.autofocus = false,
this.obscureText = false,
this.autocorrect = true,
this.maxLines = 1,
this.maxLength,
this.onSaved,
this.hintText,
this.lableText,
this.maxLengthEnforced = true,
this.onChanged,
this.defaultBorderColor,
this.onEditingComplete,
this.onSubmitted,
this.inputFormatters,
this.enabled,
this.cursorWidth = 2.0,
this.cursorRadius,
this.cursorColor,
this.keyboardAppearance,
this.scrollPadding,
this.validator,
this.onFieldSubmitted,
}) : assert(textAlign != null),
assert(autofocus != null),
assert(obscureText != null),
assert(autocorrect != null),
assert(maxLengthEnforced != null),
assert(maxLines == null || maxLines > 0),
assert(maxLength == null || maxLength > 0),
keyboardType = keyboardType ??
(maxLines == 1 ? TextInputType.text : TextInputType.multiline);
@override
_BoxFeildState createState() => _BoxFeildState();
}
class _BoxFeildState extends State<BoxFeild> {
double width;
double height;
Color focusBorderColor = Colors.grey.shade400;
FocusNode _focusNode = FocusNode();
ValueChanged<Colors> focusColorChange;
@override
void dispose() {
super.dispose();
_focusNode.dispose();
}
@override
Widget build(BuildContext context) {
width = MediaQuery.of(context).size.width;
height = MediaQuery.of(context).size.height;
return Container(
child: Row(
crossAxisAlignment: CrossAxisAlignment.center,
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
SizedBox(
width: width / 30,
),
Expanded(
child: Container(
margin: EdgeInsets.only(top: height / 400, bottom: height / 400, left: width / 50, right: width / 50),
padding: EdgeInsets.all(height / 100),
alignment: Alignment.center,
height: height / 14,
decoration: BoxDecoration(
color: Colors.grey.shade100,
border: Border.all(color: focusBorderColor, width: 1.0),
borderRadius: BorderRadius.circular(8.0)),
child: TextFormField(
key: this.widget.key,
obscureText: this.widget.obscureText,
onSaved: this.widget.onSaved,
validator: this.widget.validator,
onFieldSubmitted: this.widget.onFieldSubmitted,
decoration: InputDecoration(
border: InputBorder.none,
prefixIcon: Icon(
this.widget.icon,
size: height/34,
),
hintText: this.widget.hintText),
),
)),
],
),
padding: EdgeInsets.only(bottom : height / 58),
margin: EdgeInsets.only(
top: height / 50, right: width / 20, left: width / 30),
);
}
}
Container _passwordWidget() {
return Container(
padding: const EdgeInsets.all(16.0),
alignment: Alignment.center,
height: 52.0,
decoration: BoxDecoration(
color: Colors.grey.shade100,
border: Border.all(color: Colors.transparent, width: 0.0),
borderRadius: BorderRadius.circular(12.0)),
child: TextFormField(
key: passKey,
obscureText: true,
validator: validatePassword,
onSaved: (String val) {
_password = val;
},
keyboardType: TextInputType.number,
style: TextStyle(
fontSize: 22.0,
color: Colors.black,
),
decoration:
InputDecoration.collapsed(hintText: "Password"),
),
);
最佳答案
您以错误的方式声明密码,使用 final Globalkey 而不是 var
关于dart - 自动验证问题 : Password and Confirm Password validation with autovalidation in Flutter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53703647/
我正在尝试让删除确认执行一个删除当前 ID 数据的函数。 我收到这个错误: Uncaught TypeError: Cannot read property 'call' of undefined 在
我经常处理在 Kate 中打开的大量文件。然后,当关闭我正在编辑的一个文件时,我无意识地按了 alt+F4,然后凯特高兴地关闭了我正在编辑的所有打开的文件,让我再次大喊大叫,并用键盘和硬件进行了另一次
这个问题在这里已经有了答案: What is the difference between alert and window.alert? (2 个答案) 关闭 9 年前。 window.confi
我使用以下代码通过 jquery ui 对话框使用默认的 javascript 确认。 jQuery.extend({ confirm: function(message, title, ok
我正在使用以下代码: :delete, :confirm => "You sure you want to delete "
Window.prototype.confirm 和 Window.confirm 有什么区别? 我正在处理一个更改请求,上面写着 We need to have a title on confirm
单击链接时,确认框消息会正常显示。 "Are you sure?", :method => :delete %> 出现确认框时,默认选中“确定”按钮;我希望默认选择“取消”按钮,这样如果用户
我正在编写一个依赖于 RabbitMQ 的 Node.js 应用程序。我正在使用 node-amqp 作为连接到 RabbitMQ 的首选库。 建立到 RabbitMQ 的连接后,我要做的第一件事就是
这是我的 sweetalert 我想在单击此确认按钮时更新我的数据库 STATUS 列请帮助我谢谢 swal({ title: 'Are you sure?', text: "Yo
有人可以告诉我,如何才能在注册的确认后后发送此邮件。无论是忘记密码/重设密码还是注册,此代码都会在每次确认后发送邮件。 var aws = require('aws-sdk'); var ses =
我想使用UIkit.modal.confirm来确认用户在UIkit.modal.prompt中的输入,如果他们确认则继续,否则返回UIkit.modal.confirm. UIkit.modal.p
在 Azure DevOps 管道中的一项任务中,我尝试停止 IIS 服务器。这可以通过在命令提示符中调用命令net stop WAS来实现。手动执行此操作,它会要求确认 手动方式,我只需按 Y EN
在 Azure DevOps 管道中的一项任务中,我尝试停止 IIS 服务器。这可以通过在命令提示符中调用命令net stop WAS来实现。手动执行此操作,它会要求确认 手动方式,我只需按 Y EN
我有一个在 AJAX 调用完成后执行的 javascript 代码。 req.done(function (response, textStatus, jqXHR){ if (response
我有一个移动网站,供各种设备使用,包括一些运行带 IE 7 的 Windows Embedded 7 锁定版本的车载计算机。出于某种我无法解释的原因,window.confirm() 已损坏,但所有其
这里是第一个问题,Stackoverflow 的新手,所以如果我有什么遗漏的地方,请指导我。我的问题如下, 我正在创建一个自定义弹出消息,例如 window.confirm。在函数中,用户需要传递一些
我正在尝试从确认框中删除“确认”标题,我在确认对话框中获取页面名称,这看起来很尴尬。 请帮我从确认对话框中删除标题。 最佳答案 不要使用window.confirm(),因为这使用了WebView的内
我在使用angular-js时调用phonegap的notification.confirm。 我的代码如下: ng-click= func(item) $scope.func = function(
我正在为用户编写删除确认代码,但是当我运行它时,它显示了这个错误 这是我的代码 onDelete = (id) => { console.log(id); if (co
我在应用程序中使用$ mdDialog,但想将其用作“确认”对话框而不是普通对话框。这意味着,在用户单击“确认”对话框中的两个按钮之一之前,不应继续执行代码流。我注意到可以使用$ mdDialog.c
我是一名优秀的程序员,十分优秀!