Flutter密码输入插件fl_pin_code的使用

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

Flutter密码输入插件fl_pin_code的使用

fl_pin_code 插件帮助你在 Flutter 应用程序中显示 PIN 码。

特性 👇👇

  • 隐藏支持
  • 自动移动焦点
  • 字段形状(框、下划线)
  • null 安全

安装 🔧

安装 fl_pin_code 的最新版本。

1. 添加依赖

在你的项目 pubspec.yaml 文件中添加以下依赖:

dependencies:
  fl_pin_code: ^0.0.9

2. 获取依赖

你可以通过命令行来安装包:

flutter packages get

或者,如果你使用的是编辑器,可能支持 flutter packages get。请查看你的编辑器文档以了解更多详情。

3. 导入插件

在 Dart 代码中导入 fl_pin_code

import 'package:fl_pin_code/fl_pin_code.dart';

使用示例

以下是使用 fl_pin_code 的一些示例代码:

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

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

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'fl_pin_code demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(title: 'Home Page'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  MyHomePage({Key? key, this.title}) : super(key: key);

  final String? title;

  [@override](/user/override)
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  bool _passwordObscureText = true;

  void showModalPinBottomSheet() {
    showModalBottomSheet(
      isScrollControlled: true,
      shape: RoundedRectangleBorder(
        borderRadius: BorderRadius.only(
          topLeft: Radius.circular(25),
          topRight: Radius.circular(25),
        ),
      ),
      context: context,
      builder: (_) {
        return Container(
          padding: EdgeInsets.only(bottom: 5),
          margin: EdgeInsets.symmetric(horizontal: 20),
          child: SingleChildScrollView(
            child: Column(
              crossAxisAlignment: CrossAxisAlignment.center,
              children: [
                SizedBox(height: 10),
                PinCode(
                  numberOfFields: 5,
                  fieldWidth: 40.0,
                  style: TextStyle(color: Colors.black, fontSize: 15),
                  fieldStyle: PinCodeStyle.box,
                  onCompleted: (text) {
                    if (text.trim() == "11111") {
                      setState(() {
                        _passwordObscureText = false;
                      });
                    } else {
                      ScaffoldMessenger.of(context).showSnackBar(
                        SnackBar(content: Text('Please insert 11111 to unlock')),
                      );
                    }
                    Navigator.of(context).pop();
                  },
                ),
              ],
            ),
          ),
        );
      },
    );
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title!),
      ),
      body: Padding(
        padding: EdgeInsets.all(10),
        child: Builder(
          builder: (context) {
            return Form(
              key: UniqueKey(),
              child: SingleChildScrollView(
                child: Column(
                  crossAxisAlignment: CrossAxisAlignment.start,
                  children: [
                    SizedBox(height: 20),
                    TextFormField(
                      readOnly: true,
                      showCursor: false,
                      obscureText: _passwordObscureText,
                      initialValue: 'A_asdw[jd%_*klmdn',
                      decoration: InputDecoration(
                        suffixIcon: IconButton(
                          onPressed: () {
                            setState(() {
                              if (_passwordObscureText) {
                                showModalPinBottomSheet();
                              } else {
                                _passwordObscureText = true;
                              }
                            });
                          },
                          icon: Icon(
                            _passwordObscureText
                                ? Icons.visibility_off
                                : Icons.visibility,
                          ),
                          iconSize: 18.0,
                        ),
                      ),
                    ),
                    SizedBox(height: 15),
                  ],
                ),
              ),
            );
          },
        ),
      ),
    );
  }
}

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

1 回复

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


当然,以下是如何在Flutter项目中使用fl_pin_code插件来实现密码输入功能的代码示例。fl_pin_code插件是一个非常流行的用于输入PIN码或密码的Flutter包。

1. 添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  fl_pin_code: ^2.0.0  # 请确保使用最新版本

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

2. 导入包

在你的Dart文件中导入fl_pin_code包:

import 'package:fl_pin_code/fl_pin_code.dart';

3. 使用FlPinCodeField

下面是一个简单的例子,展示了如何使用FlPinCodeField小部件来创建一个PIN码输入界面:

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Pin Code Example',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: PinCodeScreen(),
    );
  }
}

class PinCodeScreen extends StatefulWidget {
  @override
  _PinCodeScreenState createState() => _PinCodeScreenState();
}

class _PinCodeScreenState extends State<PinCodeScreen> {
  final TextEditingController _controller = TextEditingController();
  final FocusNode _focusNode = FocusNode();
  String _pinCode = '';

  @override
  void dispose() {
    _controller.dispose();
    _focusNode.dispose();
    super.dispose();
  }

  void _onCompleted(String pin) {
    setState(() {
      _pinCode = pin;
    });
    // 在这里处理PIN码输入完成后的逻辑,比如验证PIN码
    print('PIN Code Entered: $_pinCode');
  }

  void _onChanged(String value) {
    // 实时处理PIN码输入变化,如果需要的话
    print('PIN Code Changed: $value');
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter Pin Code Example'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              'Enter your PIN code:',
              style: TextStyle(fontSize: 20),
            ),
            SizedBox(height: 20),
            FlPinCodeField(
              controller: _controller,
              focusNode: _focusNode,
              length: 6, // PIN码长度
              width: 50,
              height: 60,
              animationType: AnimationType.fade,
              pinTheme: PinTheme(
                shape: PinCodeFieldShape.box,
                borderRadius: BorderRadius.circular(10),
                fieldHeight: 60,
                fieldWidth: 50,
                activeColor: Colors.blue,
                inactiveColor: Colors.grey[300]!,
                inactiveFillColor: Colors.white,
                selectedColor: Colors.blueAccent,
                animationDuration: Duration(milliseconds: 300),
                enableActiveEffect: true,
              ),
              animationDuration: Duration(milliseconds: 300),
              onCompleted: _onCompleted,
              onChanged: _onChanged,
              beforeTextPaste: (text) {
                // 在粘贴文本之前进行一些处理
                return text.replaceAll(RegExp(r'[^0-9]'), ''); // 只允许数字
              },
              keyboardType: TextInputType.number,
            ),
          ],
        ),
      ),
    );
  }
}

解释

  • FlPinCodeField小部件用于创建PIN码输入界面。
  • controllerfocusNode用于控制文本输入和焦点。
  • length属性指定PIN码的长度。
  • pinTheme属性允许你自定义PIN码输入字段的样式。
  • onCompleted回调在PIN码输入完成时触发。
  • onChanged回调在PIN码输入变化时触发。
  • beforeTextPaste回调允许你在粘贴文本之前进行一些处理,例如只允许粘贴数字。

这段代码提供了一个基本的PIN码输入界面,并展示了如何使用fl_pin_code插件的主要功能。你可以根据需要进行进一步的自定义和扩展。

回到顶部