Flutter文本格式化插件flutter_masked_text的使用

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

Flutter文本格式化插件flutter_masked_text的使用

flutter_masked_text 是一个用于 Flutter 的文本格式化插件,可以帮助开发者轻松实现输入框的格式化功能。无论是电话号码、身份证号还是货币金额,都可以通过简单的配置实现。

安装

pubspec.yaml 文件中添加以下依赖:

dependencies:
  flutter_masked_text: ^2.0.0

然后运行以下命令安装:

flutter pub get

使用

导入库

首先,在 Dart 文件中导入 flutter_masked_text 库:

import 'package:flutter_masked_text/flutter_masked_text.dart';

MaskedText 示例

创建掩码控制器

创建一个掩码控制器并设置掩码格式:

var controller = new MaskedTextController(mask: '000.000.000-00');

设置到文本字段

将控制器绑定到 TextField 中:

return new MaterialApp(
    title: 'Flutter Demo',
    theme: new ThemeData(
        primarySwatch: Colors.blue,
    ),
    home: new SafeArea(
        child: new Scaffold(
            body: new Column(
                children: <Widget>[
                    new TextField(
                        controller: controller, // 绑定控制器
                        decoration: InputDecoration(hintText: "请输入身份证号"),
                    )
                ],
            ),
        ),
    ),
);

运行效果如下:

示例效果

掩码选项

掩码支持以下字符:

  • 0: 仅接受数字。
  • A: 仅接受字母。
  • @: 接受数字和字母。
  • *: 接受任意字符。

初始值

可以通过 text 属性设置初始值:

var controller = new MaskedTextController(mask: '000-000', text: '123456');

动态更新文本

如果需要动态更新文本,可以使用 updateText 方法:

var controller = new MaskedTextController(text: '', mask: '000-000');
controller.updateText('123456');

print(controller.text); // 输出: 123-456

自定义翻译器

可以通过自定义翻译器来限制输入规则:

const translator = {
    '#': new RegExp(r'^[a-zA-Z0-9]+$') // 仅允许字母和数字
};

var controller = new MaskedTextController(mask: '####', translator: translator);

或者覆盖默认翻译器的部分规则:

var translator = MaskedTextController.getDefaultTranslator();
translator.remove('*'); // 移除通配符翻译器

var controller = new MaskedTextController(mask: '0000 **** **** 0000', translator: translator);
controller.updateText('12345678');

print(controller.text); // 输出: 1234 **** **** 5678

动态更改掩码

可以通过 updateMask 方法在运行时更改掩码:

var cpfController = new MaskedTextController(text: '12345678901', mask: '000.000.000-00');

print(cpfController.text); // 输出: 123.456.789-01

cpfController.updateMask('000.000.0000-0');

print(cpfController.text); // 输出: 123.456.7890-1

钩子函数

beforeChange 钩子(v0.7.0+)

在某些情况下,你可能需要验证用户输入是否符合掩码规则。可以使用 beforeChange 钩子:

var controller = new MaskedTextController(mask: '(00) 0000-0000');
controller.beforeChange = (String previous, String next) {
    // 自定义逻辑
    return next.length <= 14; // 允许最大长度为14
};

afterChange 钩子(v0.7.0+)

当文本发生变化时,可以监听 afterChange 钩子:

var controller = new MaskedTextController(mask: '(00) 0000-0000');
controller.afterChange = (String previous, String next) {
    print("$previous | $next");
};

Money Mask 示例

创建货币掩码控制器

var controller = new MoneyMaskedTextController();

使用 TextField

new TextField(
    controller: controller,
    keyboardType: TextInputType.number,
    decoration: InputDecoration(hintText: "请输入金额")
)

自定义分隔符

可以自定义小数点和千位分隔符:

var controller = new MoneyMaskedTextController(
    decimalSeparator: '.', 
    thousandSeparator: ','
);

动态设置值

通过 updateValue 方法动态设置值:

controller.updateValue(1234.56);

获取原始数值

可以通过 numberValue 属性获取原始数值:

double val = controller.numberValue;

使用装饰符号

可以在货币前或后添加符号:

// 左侧符号
var controller = new MoneyMaskedTextController(leftSymbol: 'R\$ ');
controller.updateValue(123.45);

print(controller.text); // 输出: R$ 123,45

// 右侧符号
var controller = new MoneyMaskedTextController(rightSymbol: ' US\$');
controller.updateValue(99.99);

print(controller.text); // 输出: 99,99 US$

// 两侧符号
var controller = new MoneyMaskedTextController(leftSymbol: 'to pay:', rightSymbol: ' US\$');
controller.updateValue(123.45);

print(controller.text); // 输出: to pay: 123,45 US$

监听变化

可以通过 afterChange 钩子监听掩码和原始值的变化:

var controller = new MoneyMaskedTextController();

controller.afterChange = (String masked, double raw) {
    print("$masked | $raw");
};

定义小数位数(v0.8.0+)

可以设置小数位数:

var controller = new MoneyMaskedTextController(precision: 3);
controller.updateValue(123.45);

print(controller.text); // 输出: 123,450

使用默认的 TextEditingController

MaskedTextControllerMoneyMaskedTextController 都继承自 TextEditingController,因此可以使用所有默认的方法。

示例代码

以下是一个完整的示例代码,展示了如何结合 flutter_masked_text 实现身份证号输入框和货币输入框:

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

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

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

class MyHomePage extends StatefulWidget {
  [@override](/user/override)
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  final cpfController = MaskedTextController(mask: '000.000.000-00');
  final moneyController = MoneyMaskedTextController(
    decimalSeparator: '.',
    thousandSeparator: ',',
  );

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter Masked Text'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            TextField(
              controller: cpfController,
              decoration: InputDecoration(
                labelText: '身份证号',
                hintText: '请输入身份证号',
              ),
            ),
            SizedBox(height: 20),
            TextField(
              controller: moneyController,
              keyboardType: TextInputType.number,
              decoration: InputDecoration(
                labelText: '金额',
                hintText: '请输入金额',
              ),
            ),
            SizedBox(height: 20),
            ElevatedButton(
              onPressed: () {
                print("身份证号: ${cpfController.text}");
                print("金额: ${moneyController.text} (${moneyController.numberValue})");
              },
              child: Text('提交'),
            ),
          ],
        ),
      ),
    );
  }
}

更多关于Flutter文本格式化插件flutter_masked_text的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter文本格式化插件flutter_masked_text的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


flutter_masked_text 是一个用于在 Flutter 应用中格式化文本的插件,它可以帮助你轻松地实现输入掩码(masked input),例如电话号码、日期、信用卡号等格式。通过使用这个插件,你可以确保用户输入的内容符合特定的格式要求。

安装

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

dependencies:
  flutter:
    sdk: flutter
  flutter_masked_text: ^0.9.0

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

使用示例

以下是一个简单的示例,展示如何使用 flutter_masked_text 来格式化电话号码输入。

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Flutter Masked Text Example'),
        ),
        body: MaskedTextFieldExample(),
      ),
    );
  }
}

class MaskedTextFieldExample extends StatefulWidget {
  @override
  _MaskedTextFieldExampleState createState() => _MaskedTextFieldExampleState();
}

class _MaskedTextFieldExampleState extends State<MaskedTextFieldExample> {
  var phoneController = MaskedTextController(mask: '(000) 000-0000');

  @override
  Widget build(BuildContext context) {
    return Padding(
      padding: const EdgeInsets.all(16.0),
      child: Column(
        children: [
          TextField(
            controller: phoneController,
            keyboardType: TextInputType.phone,
            decoration: InputDecoration(
              labelText: 'Phone Number',
              hintText: '(123) 456-7890',
            ),
          ),
          SizedBox(height: 20),
          ElevatedButton(
            onPressed: () {
              // 获取格式化后的电话号码
              String formattedPhone = phoneController.text;
              print('Formatted Phone: $formattedPhone');
            },
            child: Text('Submit'),
          ),
        ],
      ),
    );
  }
}

解释

  1. MaskedTextController: 这是 flutter_masked_text 提供的控制器,用于管理带有掩码的文本输入。你可以通过 mask 参数指定掩码格式。例如,(000) 000-0000 表示电话号码的格式。

  2. TextField: 使用 MaskedTextController 作为 TextField 的控制器,这样用户在输入时,文本会自动按照指定的掩码格式进行格式化。

  3. 获取格式化后的文本: 你可以通过 phoneController.text 获取格式化后的文本内容。

其他功能

flutter_masked_text 还支持其他功能,例如:

  • 动态掩码: 你可以根据用户输入的内容动态改变掩码。
  • 自定义字符: 你可以定义掩码中使用的字符,例如 0 表示数字,A 表示字母等。

示例:动态掩码

var dynamicMaskController = MaskedTextController(mask: '0000-0000');

dynamicMaskController.updateMask('0000-0000-0000'); // 动态更新掩码
回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!