程序问答   发布时间:2022-06-02  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了如何基于验证器动态更改 textformfield 中错误样式的颜色?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决如何基于验证器动态更改 textformfield 中错误样式的颜色??

开发过程中遇到如何基于验证器动态更改 textformfield 中错误样式的颜色?的问题如何解决?下面主要结合日常开发的经验,给出你关于如何基于验证器动态更改 textformfield 中错误样式的颜色?的解决方法建议,希望对你解决如何基于验证器动态更改 textformfield 中错误样式的颜色?有所启发或帮助;

我有一个 TextFormFIEld,它使用验证器检查输入是否满足一组要求。如果输入不符合特定要求,红色 中的错误文本将相应地通知用户。如果密码满足所有要求,我想以绿色(“安全密码”)返回文本。

class RegForm extends StatefulWidget {
  const RegForm({Key? key}) : super(key: key);

  @overrIDe
  _RegFormState createState() => _RegFormState();
}

class _RegFormState extends State<RegForm> {
  color errorClr = colors.red;
  final String checkAll =
                r'^(?=.*?[A-Z])(?=.*?[a-z])(?=.*?[0-9])(?=.*?[!@#\$&*~]).{8,}$';
  final String checkLetters = r'^(?=.*?[A-Z])(?=.*?[a-z])';
  final String checkNumbers = r'^(?=.*?[0-9])';
  @overrIDe
  Widget build(BuildContext context) {
    return Scaffold(
      body: TextFormFIEld(
        autovalIDateMode: AutovalIDateMode.onUserInteraction,valIDator: (value) {
          if (value == null || value.isEmpty) {
            return 'Please enter a valID password';
          } else {
            if (value.length < 8)
              return 'Password has to be 8 characters or more!';
            else if (!RegExp(checkLetters).hasMatch(value))
              return 'Password has to contain Uppercase and Lowercase letters!';
            else if (!RegExp(checkNumbers).hasMatch(value))
              return 'Password has to contain numbers!';
            else if (RegExp(checkAll).hasMatch(value)) {
              errorClr = colors.green;
              return 'Very secure password!';
            }
          }
          errorClr = colors.green;
          return 'Secure password!';
        },decoration: inputdecoration(
          errorStyle: TextStyle(
            color: errorClr,),contentpadding: EdgeInsets.fromLTRB(20.0,15.0,20.0,15.0),hintText:
              'Password must be at least 8 characters long,contains numbers and both upper and lowercase letters',border: Outlineinputborder(
            borderRadius: borderRadius.circular(10.0),);
  }
}

上面的代码不会返回绿色的“安全密码”文本,我认为这是因为验证器不会重建小部件,因此 errorStyle 不会更新。有没有办法让这个工作?

解决方法

您不能从验证器函数中调用 setState(),这是更改 errorClr 或成功文本所需要的。此外,验证器函数需要返回 null 以指示验证通过;所以你不能简单地返回安全密码!

您如何看待使用 helperText 输出成功消息。

如果非空,则文本显示在 InputDecorator.child 下方,与 errorText 位于同一位置。如果指定了非空的 errorText 值,则不会显示帮助文本。

定义一个新变量来指示密码是否有效(默认:false):

bool validPassword = false;

使用 onChanged 检查密码是否有效:

onChanged: (String value) {
  if (RegExp(checkAll).hasMatch(value))
    setState(() {
      validPassword = true;
    });
  },

helperTexthelperStyle 添加到您的 InputDecoration

 helperText: validPassword ? 'Secure Password' : null,helperStyle: TextStyle(color: Colors.green),

完整示例:

class _RegFormState extends State<RegForm> {
  final String checkAll = r'^(?=.*?[A-Z])(?=.*?[a-z])(?=.*?[0-9])(?=.*?[!@#\$&*~]).{8,}$';
  final String checkSpecial = r'^(?=.*?[!@#\$&*~])';
  final String checkLetters = r'^(?=.*?[A-Z])(?=.*?[a-z])';
  final String checkNumbers = r'^(?=.*?[0-9])';

  bool validPassword = false;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: TextFormField(
        autovalidateMode: AutovalidateMode.onUserInteraction,validator: (value) {
            if (value == null || value.isEmpty || value.trim().length < 8) // use trim() for the whitrespaces
              return 'Password has to be 8 characters or more!';

            if (!RegExp(checkLetters).hasMatch(value))
              return 'Password has to contain Uppercase and Lowercase letters!';

            if (!RegExp(checkNumbers).hasMatch(value))
              return 'Password has to contain numbers!';

            if (!RegExp(checkSpecial).hasMatch(value))
              return 'Password has to contain a special character!';

            return null; // to indicate a success
         },onChanged: (String value) {
           if (RegExp(checkAll).hasMatch(value))
             setState(() {
               validPassword = true;
             });
           },decoration: InputDecoration(
          contentPadding: EdgeInsets.fromLTRB(20.0,15.0,20.0,15.0),helperText: validPassword ? 'Secure Password' : null,hintText:
          'Password must be at least 8 characters long,contains numbers and both upper and lowercase letters',border: OutlineInputBorder(
            borderRadius: BorderRadius.circular(10.0),),);
  }

大佬总结

以上是大佬教程为你收集整理的如何基于验证器动态更改 textformfield 中错误样式的颜色?全部内容,希望文章能够帮你解决如何基于验证器动态更改 textformfield 中错误样式的颜色?所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签: