Flutter密码输入插件reactive_fancy_password_field的使用

Flutter密码输入插件reactive_fancy_password_field的使用

reactive_fancy_password_field 是一个用于在 Flutter 应用中处理密码输入的插件。它结合了 fancy_password_fieldreactive_forms 的功能,使得密码输入更加直观和安全。

安装

首先,在你的 pubspec.yaml 文件中添加依赖:

dependencies:
  reactive_fancy_password_field: ^版本号
  reactive_forms: ^版本号

然后运行 flutter pub get 来安装这些依赖。

使用示例

以下是一个完整的示例,展示了如何在 Flutter 应用中使用 reactive_fancy_password_field 插件。

示例代码

import 'package:flutter/material.dart';
import 'package:reactive_fancy_password_field/reactive_fancy_password_field.dart';
import 'package:reactive_forms/reactive_forms.dart';
import 'package:step_progress_indicator/step_progress_indicator.dart';

void main() {
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  // 构建表单
  FormGroup buildForm() => fb.group({
        'input': FormControl<String>(),
      });

  // 根据强度返回进度条的当前步骤
  int getStep(double strength) {
    if (strength == 0) {
      return 0;
    } else if (strength < .1) {
      return 1;
    } else if (strength < .2) {
      return 2;
    } else if (strength < .3) {
      return 3;
    } else if (strength < .4) {
      return 4;
    } else if (strength < .5) {
      return 5;
    } else if (strength < .6) {
      return 6;
    } else if (strength < .7) {
      return 7;
    }
    return 8;
  }

  // 根据强度返回颜色
  Color? getColor(double strength) {
    if (strength == 0) {
      return Colors.grey[300];
    } else if (strength < .1) {
      return Colors.red;
    } else if (strength < .2) {
      return Colors.red;
    } else if (strength < .3) {
      return Colors.yellow;
    } else if (strength < .4) {
      return Colors.yellow;
    } else if (strength < .5) {
      return Colors.yellow;
    } else if (strength < .6) {
      return Colors.green;
    } else if (strength < .7) {
      return Colors.green;
    }
    return Colors.green;
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
        visualDensity: VisualDensity.adaptivePlatformDensity,
      ),
      home: Scaffold(
        body: SafeArea(
          child: SingleChildScrollView(
            physics: const BouncingScrollPhysics(),
            padding: const EdgeInsets.symmetric(
              horizontal: 20.0,
              vertical: 20.0,
            ),
            child: ReactiveFormBuilder(
              form: buildForm,
              builder: (context, form, child) {
                return Column(
                  children: [
                    // 密码输入字段
                    ReactiveFancyPasswordField<String>(
                      formControlName: 'input',
                      decoration: const InputDecoration(
                        prefixIcon: Icon(Icons.lock),
                        border: OutlineInputBorder(),
                        hintText: 'Password',
                      ),
                      validationRules: {
                        UppercaseValidationRule(), // 大写字母验证规则
                        LowercaseValidationRule(), // 小写字母验证规则
                        DigitValidationRule(), // 数字验证规则
                        SpecialCharacterValidationRule(), // 特殊字符验证规则
                        MinCharactersValidationRule(6), // 最小字符数验证规则
                      },
                      strengthIndicatorBuilder: (strength) {
                        return Padding(
                          padding: const EdgeInsets.symmetric(vertical: 8),
                          child: StepProgressIndicator(
                            totalSteps: 8,
                            currentStep: getStep(strength),
                            selectedColor: getColor(strength)!,
                            unselectedColor: Colors.grey[300]!,
                          ),
                        );
                      },
                      validationRuleBuilder: (rules, value) {
                        return Wrap(
                          runSpacing: 8,
                          spacing: 4,
                          children: rules.map(
                            (rule) {
                              final ruleValidated = rule.validate(value);
                              return Chip(
                                label: Row(
                                  mainAxisSize: MainAxisSize.min,
                                  children: [
                                    if (ruleValidated) ...[
                                      const Icon(
                                        Icons.check,
                                        color: Color(0xFF0A9471),
                                      ),
                                      const SizedBox(width: 8),
                                    ],
                                    Text(
                                      rule.name,
                                      style: TextStyle(
                                        color: ruleValidated
                                            ? const Color(0xFF0A9471)
                                            : const Color(0xFF9A9FAF),
                                      ),
                                    ),
                                  ],
                                ),
                                backgroundColor: ruleValidated
                                    ? const Color(0xFFD0F7ED)
                                    : const Color(0xFFF4F5F6),
                              );
                            },
                          ).toList(),
                        );
                      },
                    ),
                    const SizedBox(height: 16),
                    // 注册按钮
                    ElevatedButton(
                      child: const Text('Sign Up'),
                      onPressed: () {
                        if (form.valid) {
                          // 忽略:打印表单值
                          print(form.value);
                        } else {
                          form.markAllAsTouched();
                        }
                      },
                    ),
                  ],
                );
              },
            ),
          ),
        ),
      ),
    );
  }
}

代码解释

  1. 导入库

    import 'package:flutter/material.dart';
    import 'package:reactive_fancy_password_field/reactive_fancy_password_field.dart';
    import 'package:reactive_forms/reactive_forms.dart';
    import 'package:step_progress_indicator/step_progress_indicator.dart';
    
  2. 构建表单

    FormGroup buildForm() => fb.group({
          'input': FormControl<String>(),
        });
    
  3. 根据强度返回进度条的当前步骤

    int getStep(double strength) {
      if (strength == 0) {
        return 0;
      } else if (strength < .1) {
        return 1;
      } else if (strength < .2) {
        return 2;
      } else if (strength < .3) {
        return 3;
      } else if (strength < .4) {
        return 4;
      } else if (strength < .5) {
        return 5;
      } else if (strength < .6) {
        return 6;
      } else if (strength < .7) {
        return 7;
      }
      return 8;
    }
    
  4. 根据强度返回颜色

    Color? getColor(double strength) {
      if (strength == 0) {
        return Colors.grey[300];
      } else if (strength < .1) {
        return Colors.red;
      } else if (strength < .2) {
        return Colors.red;
      } else if (strength < .3) {
        return Colors.yellow;
      } else if (strength < .4) {
        return Colors.yellow;
      } else if (strength < .5) {
        return Colors.yellow;
      } else if (strength < .6) {
        return Colors.green;
      } else if (strength < .7) {
        return Colors.green;
      }
      return Colors.green;
    }
    
  5. 构建应用主界面

    [@override](/user/override)
    Widget build(BuildContext context) {
      return MaterialApp(
        title: 'Flutter Demo',
        theme: ThemeData(
          primarySwatch: Colors.blue,
          visualDensity: VisualDensity.adaptivePlatformDensity,
        ),
        home: Scaffold(
          body: SafeArea(
            child: SingleChildScrollView(
              physics: const BouncingScrollPhysics(),
              padding: const EdgeInsets.symmetric(
                horizontal: 20.0,
                vertical: 20.0,
              ),
              child: ReactiveFormBuilder(
                form: buildForm,
                builder: (context, form, child) {
                  return Column(
                    children: [
                      ReactiveFancyPasswordField<String>(
                        formControlName: 'input',
                        decoration: const InputDecoration(
                          prefixIcon: Icon(Icons.lock),
                          border: OutlineInputBorder(),
                          hintText: 'Password',
                        ),
                        validationRules: {
                          UppercaseValidationRule(),
                          LowercaseValidationRule(),
                          DigitValidationRule(),
                          SpecialCharacterValidationRule(),
                          MinCharactersValidationRule(6),
                        },
                        strengthIndicatorBuilder: (strength) {
                          return Padding(
                            padding: const EdgeInsets.symmetric(vertical: 8),
                            child: StepProgressIndicator(
                              totalSteps: 8,
                              currentStep: getStep(strength),
                              selectedColor: getColor(strength)!,
                              unselectedColor: Colors.grey[300]!,
                            ),
                          );
                        },
                        validationRuleBuilder: (rules, value) {
                          return Wrap(
                            runSpacing: 8,
                            spacing: 4,
                            children: rules.map(
                              (rule) {
                                final ruleValidated = rule.validate(value);
                                return Chip(
                                  label: Row(
                                    mainAxisSize: MainAxisSize.min,
                                    children: [
                                      if (ruleValidated) ...[
                                        const Icon(
                                          Icons.check,
                                          color: Color(0xFF0A9471),
                                        ),
                                        const SizedBox(width: 8),
                                      ],
                                      Text(
                                        rule.name,
                                        style: TextStyle(
                                          color: ruleValidated
                                              ? const Color(0xFF0A9471)
                                              : const Color(0xFF9A9FAF),
                                        ),
                                      ),
                                    ],
                                  ),
                                  backgroundColor: ruleValidated
                                      ? const Color(0xFFD0F7ED)
                                      : const Color(0xFFF4F5F6),
                                );
                              },
                            ).toList(),
                          );
                        },
                      ),
                      const SizedBox(height: 16),
                      ElevatedButton(
                        child: const Text('Sign Up'),
                        onPressed: () {
                          if (form.valid) {
                            // 忽略:打印表单值
                            print(form.value);
                          } else {
                            form.markAllAsTouched();
                          }
                        },
                      ),
                    ],
                  );
                },
              ),
            ),
          ),
        ),
      );
    }
    

更多关于Flutter密码输入插件reactive_fancy_password_field的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter密码输入插件reactive_fancy_password_field的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


reactive_fancy_password_field 是一个 Flutter 插件,用于处理密码输入的表单字段。它是基于 reactive_forms 包的扩展,提供了密码输入的相关功能,如密码可见性切换、密码强度验证等。

安装

首先,你需要在 pubspec.yaml 文件中添加依赖:

dependencies:
  reactive_forms: ^10.0.0
  reactive_fancy_password_field: ^1.0.0

然后运行 flutter pub get 来安装依赖。

基本使用

以下是一个简单的示例,展示如何使用 reactive_fancy_password_field

import 'package:flutter/material.dart';
import 'package:reactive_forms/reactive_forms.dart';
import 'package:reactive_fancy_password_field/reactive_fancy_password_field.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: Text('Reactive Fancy Password Field Example')),
        body: PasswordForm(),
      ),
    );
  }
}

class PasswordForm extends StatelessWidget {
  final form = FormGroup({
    'password': FormControl<String>(validators: [Validators.required]),
  });

  @override
  Widget build(BuildContext context) {
    return ReactiveForm(
      formGroup: form,
      child: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Column(
          children: <Widget>[
            ReactiveFancyPasswordField(
              formControlName: 'password',
              decoration: InputDecoration(labelText: 'Password'),
              validationMessages: {
                ValidationMessage.required: (error) => 'The password must not be empty',
              },
            ),
            const SizedBox(height: 20),
            ElevatedButton(
              child: Text('Submit'),
              onPressed: () {
                if (form.valid) {
                  print('Form is valid');
                  print('Password: ${form.control('password').value}');
                } else {
                  print('Form is invalid');
                }
              },
            ),
          ],
        ),
      ),
    );
  }
}

主要功能

  1. 密码可见性切换:默认情况下,密码字段会显示一个眼睛图标,点击图标可以切换密码的可见性。

  2. 密码强度验证:你可以通过 strengthChecker 参数来添加密码强度验证逻辑。

  3. 自定义装饰:你可以通过 decoration 参数自定义输入框的装饰,如标签、提示文本等。

  4. 验证消息:你可以通过 validationMessages 参数自定义验证错误消息。

自定义密码强度验证

你可以通过 strengthChecker 参数来添加自定义的密码强度验证逻辑。例如:

ReactiveFancyPasswordField(
  formControlName: 'password',
  decoration: InputDecoration(labelText: 'Password'),
  strengthChecker: (value) {
    if (value.length < 8) {
      return 'Password must be at least 8 characters long';
    }
    return null; // 返回 null 表示密码强度足够
  },
  validationMessages: {
    ValidationMessage.required: (error) => 'The password must not be empty',
  },
),
回到顶部