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),
        ),
      ),
    );
  }
}