如何在 Flutter 中制作密码验证动画

Posted

技术标签:

【中文标题】如何在 Flutter 中制作密码验证动画【英文标题】:How to do a password validation animation in Flutter 【发布时间】:2021-07-21 07:21:59 【问题描述】:

我正在尝试创建一个从密码TextFormField() 获取值的函数,并检查用户是否包含大写字母、小写字母、数字和特殊字符,并据此更新Text('Must have an upperCase letter')我拥有的小部件并相应地更改它们的颜色和图标。

使用我的代码,我不断收到此错误:

setState() or markNeedsBuild called during build

我正在尝试做的一个工作示例是here

到目前为止我的功能(这也是我的验证器):

String isPasswordCompliant(String password, [int minLength = 6]) 
      if (password.length < minLength || password.isEmpty) 
        return 'Password must be at least 6 characters long';
      
      if (password.contains(RegExp(r"[a-z]"))) 
        setState(() 
          _passwordChecker.hasLowercase = true;
        );
      
      if (password.contains(RegExp(r"[A-Z]"))) 
        setState(() 
          _passwordChecker.hasUppercase = true;
        );
      
      if (password.contains(RegExp(r"[0-9]"))) 
        setState(() 
          _passwordChecker.hasDigits = true;
        );
      
      if (password.contains(RegExp(r'[!@#$%^&*(),.?":|<>]'))) 
        setState(() 
          _passwordChecker.hasSpecialCharacters = true;
        );
       else 
        return null;
      
  

我是如何实现这个功能的:

                    TextFormField(
                      decoration: const InputDecoration(labelText: 'Password'),
                      obscureText: true,
                      controller: _passwordController,
                      textInputAction: TextInputAction.next,
                      onFieldSubmitted: (_) 
                        FocusScope.of(context)
                            .requestFocus(_confirmPasswordFocusNode);
                      ,
                      focusNode: _passwordFocusNode,
                      validator: (value) => isPasswordCompliant(value),
                      onSaved: (value) 
                        _authData['password'] = value;
                      ,
                    ),

我的 Text() 小部件:

class PasswordChecker extends StatelessWidget 
  PasswordChecker(this._passwordChecker);
  final PasswordValidationModel _passwordChecker;
  // final _passwordChecker = PasswordValidationModel();
  @override
  Widget build(BuildContext context) 
    return Column(
      crossAxisAlignment: CrossAxisAlignment.start,
      children: [
        TextButton.icon(
          icon: _passwordChecker.hasUppercase == true
              ? Icon(Icons.done)
              : Icon(Icons.clear),
          label: Text(
            'Must have at least one upperCase letter',
          ),
          onPressed: () ,
        ),
        TextButton.icon(
          icon: _passwordChecker.hasLowercase == true
              ? Icon(Icons.done)
              : Icon(Icons.clear),
          label: Text(
            'Must have at least one lowerCase letter',
          ),
          onPressed: () ,
        ),
        TextButton.icon(
          icon: _passwordChecker.hasDigits == true
              ? Icon(Icons.done)
              : Icon(Icons.clear),
          label: Text(
            'Must have at least one number',
          ),
          onPressed: () ,
        ),
        TextButton.icon(
          icon: _passwordChecker.hasSpecialCharacters == true
              ? Icon(Icons.done)
              : Icon(Icons.clear),
          label: Text(
            'Must have at least one special character',
          ),
          onPressed: () ,
        ),
      ],
    );
  

【问题讨论】:

您考虑过使用正则表达式吗? this 可能会有所帮助! 【参考方案1】:

在我进行更多研究后,我发现了一个类似的project,并提出了一个简单的解决方案,即在密码控制器中添加一个addListener(),并在initState() 中对其进行初始化并在那里执行逻辑。

@override
  void initState() 
    super.initState();
    _passwordController.addListener(() 
      setState(() 
        if (_passwordChecker.hasLowercase =
            _passwordController.text.contains(RegExp(r'[a-z]'))) 
          _passwordChecker.hasLowercase = true;
        
        if (_passwordChecker.hasUppercase =
            _passwordController.text.contains(RegExp(r'[A-Z]'))) 
          _passwordChecker.hasUppercase = true;
        
        if (_passwordChecker.hasDigits =
            _passwordController.text.contains(RegExp(r'[0-9]'))) 
          _passwordChecker.hasDigits = true;
        
        if (_passwordChecker.hasSpecialCharacters = _passwordController.text
            .contains(RegExp(r'[!@#$%^&*(),.?":|<>]'))) 
          _passwordChecker.hasSpecialCharacters = true;
        
      );
    );
  

【讨论】:

以上是关于如何在 Flutter 中制作密码验证动画的主要内容,如果未能解决你的问题,请参考以下文章

在电子邮件密码身份验证中进行额外的自定义检查 (Flutter - Firebase)

Flutter web 无密码登录不会触发身份验证状态更改

使用canvas实现图片滑动验证

在不使用 Firebase 的情况下使用电子邮件和密码进行 Flutter 身份验证

使用flutter_bloc提交时如何验证表单?

unity状态机怎么调出来