[英]Flutter TextFormField Validation using constructor to call in one page error
我有 3 個構造函數類
Textformfield.dart
Validator.dart
Signin.dart
這是 textformfield.dart
class CustomTextField extends StatelessWidget {
final String hint;
final TextEditingController textEditingController;
final TextInputType keyboardType;
final bool obscureText;
final IconData icon;
final Validator validator;
double _width;
double _pixelRatio;
bool large;
bool medium;
CustomTextField({
this.hint,
this.textEditingController,
this.keyboardType,
this.icon,
this.obscureText = false,
this.validator,
});
@override
Widget build(BuildContext context) {
_width = MediaQuery.of(context).size.width;
_pixelRatio = MediaQuery.of(context).devicePixelRatio;
large = ResponsiveWidget.isScreenLarge(_width, _pixelRatio);
medium = ResponsiveWidget.isScreenMedium(_width, _pixelRatio);
return Material(
borderRadius: BorderRadius.circular(30.0),
elevation: large ? 12 : (medium ? 10 : 8),
child: TextFormField(
autovalidate: true,
controller: textEditingController,
keyboardType: keyboardType,
cursorColor: Colors.orange[200],
decoration: InputDecoration(
prefixIcon: Icon(icon, color: Colors.orange[200], size: 20),
hintText: hint,
border: OutlineInputBorder(
borderRadius: BorderRadius.circular(30.0),
borderSide: BorderSide.none),
),
),
);
}
}
她是我的validator.dart代碼
class Validator {
String validateName(String value) {
String pattern = r'(^[a-zA-Z ]*$)';
RegExp regExp = new RegExp(pattern);
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 validateMobile(String value) {
String pattern = r'(^[0-9]*$)';
RegExp regExp = new RegExp(pattern);
if (value.length == 0) {
return "Mobile is Required";
} else if (value.length != 10) {
return "Mobile number must 10 digits";
} else if (!regExp.hasMatch(value)) {
return "Mobile Number must be digits";
}
return null;
}
String validatePasswordLength(String value){
if(value.length==0){
return "Password can't be empty";
} else if (value.length < 10){
return "Password must be longer than 10 characters";
}
return null;
}
String validateEmail(String value) {
String pattern =
r'^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$';
RegExp regExp = new RegExp(pattern);
if (value.length == 0) {
return "Email is Required";
} else if (!regExp.hasMatch(value)) {
return "Invalid Email";
} else {
return null;
}
}
}
這是我遇到錯誤的一些 signin.dart 代碼。
Widget form() {
return Container(
margin: EdgeInsets.only(
left: _width / 12.0, right: _width / 12.0, top: _height / 15.0),
child: Form(
key: _key,
autovalidate: _validate,
child: Column(
children: <Widget>[
emailTextFormField(),
SizedBox(height: _height / 40.0),
passwordTextFormField(),
],
),
),
);
}
Widget emailTextFormField() {
return CustomTextField(
keyboardType: TextInputType.emailAddress,
textEditingController: emailController,
icon: Icons.email,
hint: "Email ID",
validator: Validator().validateEmail,
);
}
Widget passwordTextFormField() {
return CustomTextField(
keyboardType: TextInputType.emailAddress,
textEditingController: passwordController,
icon: Icons.lock,
obscureText: true,
hint: "Password",
);
}
我嘗試調用Validator().validateEmail,
使用“ validator: Validator().validateEmail,
”來驗證我在 emailTextFormField 中的文本
它總是顯示錯誤:無法將參數類型“字符串”分配給參數類型Validator
任何建議調用validator
來使用我的Validator
類驗證emailTextFormField
嗎?
更改CustomTextField 中的這一行
class CustomTextField extends StatelessWidget {
//final Validator validator;//remove this line
final FormFieldValidator<String> validator; // add this line
現在已經一年多了,所以你可能不再需要任何幫助了。 無論如何:我只是偶然發現了這篇有類似問題的帖子。
解決方案:
像這樣的東西:
驗證.dart:
String validateName(String value) {
String pattern = r'(^[a-zA-Z ]*$)';
RegExp regExp = new RegExp(pattern);
if (value.length == 0) {
return "Name is Required";
} else if (!regExp.hasMatch(value)) {
return "Name must be a-z and A-Z";
}
return null;
}
主要.dart:
import 'validate.dart';
(...)
return CustomTextField(
validator: validateName,
(...)
);
希望在某些時候可以幫助某人:)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.