Flutter 为什么reactiveTextFields不';与FormGroup不在同一班级时,您的学习成绩如何?
我有一个初始化了Flutter 为什么reactiveTextFields不';与FormGroup不在同一班级时,您的学习成绩如何?,flutter,flutter-reactive-forms,Flutter,Flutter Reactive Forms,我有一个初始化了FormGroup的类: final form = FormGroup( { 'oldPassword': FormControl<String>( value: null, validators: [ Validators.required, ], ), 'newPassword': FormControl<String>( v
FormGroup
的类:
final form = FormGroup(
{
'oldPassword': FormControl<String>(
value: null,
validators: [
Validators.required,
],
),
'newPassword': FormControl<String>(
value: null,
touched: true,
validators: [
Validators.pattern(r'^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)[a-zA-Z\d]{8,}$',
validationMessage:
'Required: \n * One uppercase and one downcase letter \n * Atleast one number \n * Atleast 8 characters')
],
),
'repeatPassword': FormControl<String>(
value: null,
validators: [
Validators.required,
],
),
},
validators: [
Validators.mustMatch(
'newPassword',
'repeatPassword',
)
],
);
我之所以这样做,是因为我希望每个ReactivePasswordField
都有自己的状态来管理显示和隐藏输入视图。
问题是当我输入到ReactivePasswordField
中的一个时,其他的都有相同的输入。
我的验证器也不工作。
我怎样才能修好它
在初始化FormGroup的类中,我如何使用我的反应性密码字段
:
SingleChildScrollView(
child: ReactiveForm(
formGroup: form,
child: Column(
children: [
ReactivePasswordField(
controlName: 'oldPassword',
hintText: 'Current password',
onSubmitted: () => form.focus('newPassword')),
Padding(
padding: const EdgeInsets.symmetric(vertical: 8.0),
child: ReactivePasswordField(
controlName: 'newPassword',
hintText: 'New password',
onSubmitted: () => form.focus('repeatPassword'),
),
),
ReactivePasswordField(
controlName: 'repeatPassword',
hintText: 'Repeat password',
onSubmitted: () => {},
)
],
),
)),
我刚刚在我的
反应密码字段
课上搞砸了。
有以下变化:
import 'package:flutter/material.dart';
import 'package:reactive_forms/reactive_forms.dart';
class ReactivePasswordField extends StatefulWidget {
final String controlName;
final String hintText;
final Function() onSubmitted;
const ReactivePasswordField({
required this.controlName,
required this.hintText,
required this.onSubmitted,
});
@override
_ReactivePasswordFieldState createState() => _ReactivePasswordFieldState();
}
class _ReactivePasswordFieldState extends State<ReactivePasswordField> {
bool isObscure = true;
IconData icon = Icons.visibility_off;
@override
Widget build(BuildContext context) {
return ReactiveTextField(
autofocus: true,
obscureText: isObscure,
//-------------CHANGE--------------------------------------------------------
//Here i had static String instead of widget.controlName
formControlName: widget.controlName,
onSubmitted: () => widget.onSubmitted,
validationMessages: (control) => {
'required': 'Field cannot be empty.',
'mustMatch': 'New password must match.'
},
decoration: InputDecoration(
filled: true,
prefixIcon: Icon(
Icons.lock,
color: Color(0xffe96cbd),
),
hintText: widget.hintText,
suffixIcon: GestureDetector(
onTap: () {
if (isObscure) {
setState(() {
icon = Icons.visibility_off;
isObscure = false;
});
} else {
setState(() {
icon = Icons.visibility;
isObscure = true;
});
}
},
child: Icon(
icon,
color: Color(0xff3A4A78),
)),
border: OutlineInputBorder(
borderSide: BorderSide.none,
borderRadius: BorderRadius.circular(20.0),
),
),
);
}
}
导入“包装:颤振/材料.省道”;
导入“package:reactive_forms/reactive_forms.dart”;
类ReactivePasswordField扩展StatefulWidget{
最后的字符串控制名;
最终字符串hintText;
最终函数()已提交;
常量反应密码字段({
需要此.controlName,
需要此.hintText,
需要此项。提交时,
});
@凌驾
_ReactivePasswordFieldState createState()=>\u ReactivePasswordFieldState();
}
类_ReactivePasswordFieldState扩展状态{
布尔isObscure=真;
Iconda icon=Icons.visibility\u关闭;
@凌驾
小部件构建(构建上下文){
返回反应文本字段(
自动对焦:对,
模糊文字:isObscure,
//-------------改变--------------------------------------------------------
//这里我使用了静态字符串,而不是widget.controlName
formControlName:widget.controlName,
onSubmitted:()=>widget.onSubmitted,
验证消息:(控制)=>{
“必需”:“字段不能为空。”,
“mustMatch”:“新密码必须匹配。”
},
装饰:输入装饰(
是的,
前缀:图标(
Icons.lock,
颜色:颜色(0xffe96cbd),
),
hintText:widget.hintText,
后缀:手势检测器(
onTap:(){
if(等压线){
设置状态(){
icon=Icons.visibility\u关闭;
isObscure=假;
});
}否则{
设置状态(){
图标=图标。可见性;
isObscure=真;
});
}
},
子:图标(
偶像
颜色:颜色(0xFF3A4 A78),
)),
边框:大纲输入边框(
borderSide:borderSide.none,
边界半径:边界半径。圆形(20.0),
),
),
);
}
}
import 'package:flutter/material.dart';
import 'package:reactive_forms/reactive_forms.dart';
class ReactivePasswordField extends StatefulWidget {
final String controlName;
final String hintText;
final Function() onSubmitted;
const ReactivePasswordField({
required this.controlName,
required this.hintText,
required this.onSubmitted,
});
@override
_ReactivePasswordFieldState createState() => _ReactivePasswordFieldState();
}
class _ReactivePasswordFieldState extends State<ReactivePasswordField> {
bool isObscure = true;
IconData icon = Icons.visibility_off;
@override
Widget build(BuildContext context) {
return ReactiveTextField(
autofocus: true,
obscureText: isObscure,
//-------------CHANGE--------------------------------------------------------
//Here i had static String instead of widget.controlName
formControlName: widget.controlName,
onSubmitted: () => widget.onSubmitted,
validationMessages: (control) => {
'required': 'Field cannot be empty.',
'mustMatch': 'New password must match.'
},
decoration: InputDecoration(
filled: true,
prefixIcon: Icon(
Icons.lock,
color: Color(0xffe96cbd),
),
hintText: widget.hintText,
suffixIcon: GestureDetector(
onTap: () {
if (isObscure) {
setState(() {
icon = Icons.visibility_off;
isObscure = false;
});
} else {
setState(() {
icon = Icons.visibility;
isObscure = true;
});
}
},
child: Icon(
icon,
color: Color(0xff3A4A78),
)),
border: OutlineInputBorder(
borderSide: BorderSide.none,
borderRadius: BorderRadius.circular(20.0),
),
),
);
}
}