Flutter输入验证码插件input_code_field的使用

发布于 1周前 作者 h691938207 来自 Flutter

Flutter输入验证码插件input_code_field的使用

InputCodeControl小部件提供了一个用于输入PIN码、短信验证码以及其他认证码的文本字段。它还可以用于输入高度格式化的输入,例如日期和时间。该小部件支持退格键盘按钮。

支持开发 ☕

开发和维护此插件需要时间和精力。如果您觉得这个插件有用,并且愿意表达您的感激之情,可以考虑进行捐赠。您的贡献有助于确保插件的持续开发和改进。🚀

您可以进行捐赠并买杯咖啡以保持发展势头:

Buy Me A Coffee

您的支持至关重要,每一份捐赠都深受欢迎。感谢您帮助使这个插件变得更好!🙏

使用

InputCodeControl处理代码字段的所有逻辑、验证和状态管理。它还存储当前值和下一个字段的索引指针。

InputCodeField是一个具有下划线的标准文本字段,可以通过InputCodeDecoration进行自定义。它支持启用和禁用字段、遮蔽输入以及设置字段的大小、颜色和其他属性。

final InputCodeControl codeControl = InputCodeControl(inputRegex: '^[0-9]*$');

InputCodeField(
  control: codeControl,
  count: 6,
  inputType: TextInputType.number,
  decoration: InputCodeDecoration(
    focusColor: Colors.blueGrey,
  ),
),

Structure

手动自定义

为了更好地视觉控制,您可以使用itemBuilder回调来构建自定义字段项。要获取给定索引处的字符,可以使用InputCodeControl对象上的[]操作符。要检查给定索引处的项是否处于焦点状态,可以使用InputCodeControl.isFocused(index)方法。要检查整个小部件是否处于焦点状态,可以使用InputCodeControl.hasFocus方法。

InputCodeField(
  control: codeControl,
  itemBuilder: (context, index) => CustomCodeItem(
    char: control.stringCode.code[index],
    fieldFocused: codeControl.hasFocus,
    itemFocused: codeControl.isFocused(index),
  ),
);

class CustomCodeItem extends StatelessWidget {
  final String char;
  final bool fieldFocused;
  final bool itemFocused;

  const CustomCodeItem({
    Key? key,
    this.char = '',
    this.fieldFocused = false,
    this.itemFocused = false,
  }) : super(key: key);

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Container(
      width: 42.0,
      height: 42.0,
      decoration: BoxDecoration(
        borderRadius: BorderRadius.circular(6.0),
        color: fieldFocused ? (itemFocused ? Colors.grey : Colors.grey.withOpacity(0.5)) : Colors.grey.withOpacity(0.25),
        border: Border.all(color: itemFocused ? Colors.black : Colors.grey),
      ),
      child: Center(
        child: Text(
          char,
          style: Theme.of(context).primaryTextTheme.headline4,
        ),
      ),
    );
  }
}

Structure

为了获得完全的视觉控制,可以使用builder回调来构建整个输入小部件。InputCodeFieldInputCodeControl将继续处理所有输入逻辑和键盘操作。

InputCodeField(
  control: codeControl,
  builder: (context) => CustomCodeField(
    control: codeControl,
  ),
);

class CustomCodeField extends StatelessWidget {
  final InputCodeControl control;

  const CustomCodeField({
    Key? key,
    required this.control,
  }) : super(key: key);

  [@override](/user/override)
  Widget build(BuildContext context) {
    final List<Widget> items = [];

    for (int i = 0; i < control.count; i++) {
      if (i > 0 && i % 3 == 0) {
        items.add(Container(
          margin: EdgeInsets.symmetric(horizontal: 24.0),
          height: 32.0,
          width: 2.0,
          color: control.hasFocus ? Colors.green : Colors.blueGrey,
        ));

        items.add(Container(
          height: 42,
          width: 1.0,
          color: Colors.blueGrey,
        ));
      }

      items.add(Expanded(
        child: Container(
          height: 42.0,
          color: control.isFocused(i, true) ? Colors.greenAccent.withOpacity(0.25) : Colors.transparent,
          child: Center(
            child: Text(
              control[i],
              style: Theme.of(context).primaryTextTheme.headline4,
            ),
          ),
        ),
      ));

      if (i < control.count - 1) {
        items.add(Container(
          height: 42,
          width: 1.0,
          color: Colors.blueGrey,
        ));
      }
    }

    return ClipRRect(
      borderRadius: BorderRadius.circular(16.0),
      child: Container(
        decoration: BoxDecoration(
          borderRadius: BorderRadius.circular(16.0),
          border: Border.all(color: control.hasFocus ? Colors.green : Colors.blueGrey),
        ),
        child: Row(
          children: items,
        ),
      ),
    );
  }
}

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

1 回复

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


当然,以下是如何在Flutter项目中使用input_code_field插件来实现验证码输入的一个示例代码。input_code_field插件允许你创建一个自定义的验证码输入框,非常适合用于短信验证码等场景。

首先,确保你已经在pubspec.yaml文件中添加了input_code_field依赖:

dependencies:
  flutter:
    sdk: flutter
  input_code_field: ^x.y.z  # 请替换为最新版本号

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

接下来,在你的Dart文件中,你可以按照以下方式使用InputCodeField

import 'package:flutter/material.dart';
import 'package:input_code_field/input_code_field.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: Scaffold(
        appBar: AppBar(
          title: Text('验证码输入示例'),
        ),
        body: Center(
          child: Padding(
            padding: const EdgeInsets.all(16.0),
            child: _CodeInputScreen(),
          ),
        ),
      ),
    );
  }
}

class _CodeInputScreen extends StatefulWidget {
  @override
  _CodeInputScreenState createState() => _CodeInputScreenState();
}

class _CodeInputScreenState extends State<_CodeInputScreen> {
  final List<TextEditingController> _controllers = List.generate(6, (index) {
    return TextEditingController();
  });

  @override
  void dispose() {
    _controllers.forEach((controller) => controller.dispose());
    super.dispose();
  }

  void _onCompleted(String code) {
    print('输入的验证码是: $code');
    // 在这里处理验证码输入完成后的逻辑,比如发送到服务器验证
  }

  @override
  Widget build(BuildContext context) {
    return InputCodeField(
      controllers: _controllers,
      length: 6,
      width: 40.0,
      height: 50.0,
      border: OutlineInputBorder(
        borderRadius: BorderRadius.circular(8),
      ),
      borderActive: OutlineInputBorder(
        borderSide: BorderSide(color: Colors.blue, width: 2.0),
        borderRadius: BorderRadius.circular(8),
      ),
      style: TextStyle(fontSize: 20),
      activeStyle: TextStyle(fontSize: 20, color: Colors.blue),
      onCompleted: _onCompleted,
      onCompletedColor: Colors.blue,
      inputFormatters: [FilteringTextInputFormatter.digitsOnly],
      textDirection: TextDirection.ltr,
      mainAxisAlignment: MainAxisAlignment.center,
      crossAxisAlignment: CrossAxisAlignment.center,
      mainAxisSpacing: 8.0,
      crossAxisSpacing: 8.0,
      animationDuration: Duration(milliseconds: 300),
      keyboardType: TextInputType.number,
      decoration: InputDecoration(
        counterText: '',
      ),
    );
  }
}

代码说明:

  1. 依赖导入

    • 导入flutter/material.dartinput_code_field/input_code_field.dart
  2. 控制器创建

    • 使用TextEditingController的列表来管理每个输入框的控制器。这里我们生成了6个控制器,假设验证码长度为6。
  3. 资源释放

    • dispose方法中释放所有控制器的资源。
  4. 验证码输入完成处理

    • onCompleted回调方法会在所有输入框填充完成后被调用,这里我们简单地打印出输入的验证码。
  5. InputCodeField配置

    • controllers:传入控制器列表。
    • length:验证码的长度。
    • widthheight:每个输入框的宽度和高度。
    • borderborderActive:输入框的普通和激活状态下的边框样式。
    • styleactiveStyle:输入框的普通和激活状态下的文本样式。
    • onCompleted:验证码输入完成后的回调。
    • onCompletedColor:验证码输入完成后的颜色。
    • inputFormatters:限制输入只能为数字。
    • textDirectionmainAxisAlignmentcrossAxisAlignmentmainAxisSpacingcrossAxisSpacing:布局相关的参数。
    • animationDuration:动画持续时间。
    • keyboardType:键盘类型设置为数字键盘。
    • decoration:输入框的装饰,这里我们禁用了计数器文本。

这样,你就可以在Flutter应用中实现一个自定义的验证码输入框了。

回到顶部