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

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

插件简介

text_input_formatter 是一个Flutter插件,提供了可定制的文本格式化功能,适用于文本字段。通过该插件,您可以轻松地强制执行特定的模式和分隔符,确保一致且用户友好的文本输入体验。它非常适合用于格式化日期、数字或其他结构化的输入,增强了应用程序的数据输入界面。

该插件扩展了 pattern_formatter,增加了对精确和灵活的数值输入处理的功能。主要特性包括:

  • 扩展的小数精度:支持多达18位小数,确保金融或科学应用中的高精度。
  • 小数精度保持:使用 Decimal 库防止双精度值的意外舍入。
  • 输入长度控制:限制最大输入字符数,确保一致性并避免溢出。
  • 原始值提取:提供方法将格式化后的值转换回原始的数值输入。
  • 基于区域的自定义格式:允许根据区域设置自定义格式规则,使插件在不同地区格式下都能灵活使用。

示例图片

开始使用

1. 添加依赖

pubspec.yaml 文件中添加 text_input_formatter 依赖:

dependencies:
  text_input_formatter: ^1.0.2
2. 导入包

在 Dart 文件中导入 text_input_formatter 包:

import 'package:text_input_formatter/text_input_formatter.dart';

使用示例

以下是一个完整的示例代码,展示了如何在 Flutter 应用中使用 text_input_formatter 进行数值、日期和信用卡格式化。

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

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

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

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Input Formatter Demo',
      theme: ThemeData(
        colorScheme: ColorScheme.fromSeed(seedColor: Colors.blue),
        useMaterial3: true,
      ),
      home: const MyHomePage(title: 'Input Formatter Page'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({super.key, required this.title});

  final String title;

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

class _MyHomePageState extends State<MyHomePage> {
  [@override](/user/override)
  Widget build(BuildContext context) {
    // 定义可复用的数值格式化器
    final formatter = NumericFormatter(
      allowFraction: true,  // 允许小数
      fractionDigits: 5,    // 小数点后最多5位
      thousandSeparator: ' ',  // 千位分隔符为空格
    );

    return Scaffold(
      appBar: AppBar(
        backgroundColor: Theme.of(context).colorScheme.inversePrimary,
        title: Text(widget.title),
      ),
      body: Padding(
        padding: const EdgeInsets.all(10),
        child: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              // 数值输入框
              TextField(
                decoration: InputDecoration(
                  label: Text('Numeric'),  // 标签
                  border: OutlineInputBorder(),  // 边框样式
                ),
                inputFormatters: [formatter],  // 应用数值格式化器
                onChanged: (value) {
                  // 打印原始值
                  print(formatter.original(value));
                },
              ),
              const SizedBox(height: 20),  // 间距

              // 日期输入框
              TextField(
                decoration: InputDecoration(
                  label: Text(DatePattern.dd_MM_yyyy.value),  // 标签,显示日期格式
                  border: OutlineInputBorder(),  // 边框样式
                ),
                inputFormatters: [
                  DateFormatter(
                    separator: DateSeparator.slash,  // 日期分隔符为斜杠
                    pattern: DatePattern.dd_MM_yyyy,  // 日期格式为 dd/MM/yyyy
                  ),
                ],
              ),
              const SizedBox(height: 20),  // 间距

              // 信用卡输入框
              TextField(
                decoration: InputDecoration(
                  label: Text('Credit Card'),  // 标签
                  border: OutlineInputBorder(),  // 边框样式
                ),
                inputFormatters: [
                  CreditCardFormatter(),  // 应用信用卡格式化器
                ],
              ),
            ],
          ),
        ),
      ),
    );
  }
}

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

1 回复

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


当然,以下是一个关于如何在Flutter中使用text_input_formatter插件进行文本格式化的代码示例。text_input_formatter实际上并不是Flutter SDK的一部分,但Flutter提供了内置的TextInputFormatter类,可以用来格式化文本输入。下面是一个使用Flutter内置TextInputFormatter类的示例,包括长度限制、数字输入限制和小写字母限制。

首先,确保你的Flutter环境已经设置好,然后创建一个新的Flutter项目或在现有项目中添加以下代码。

示例代码

import 'package:flutter/material.dart';
import 'package:flutter/services.dart'; // 导入TextInputFormatter所在的包

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Text Input Formatter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  final TextEditingController _controller = TextEditingController();

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

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Text Input Formatter Demo'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.start,
          children: <Widget>[
            TextField(
              controller: _controller,
              decoration: InputDecoration(
                labelText: 'Length Limited (10 chars)',
              ),
              inputFormatters: [
                LengthLimitingTextInputFormatter(10), // 限制长度为10
              ],
            ),
            SizedBox(height: 16),
            TextField(
              decoration: InputDecoration(
                labelText: 'Only Numbers',
              ),
              keyboardType: TextInputType.number,
              inputFormatters: [
                FilteringTextInputFormatter.digitsOnly, // 仅允许数字输入
              ],
            ),
            SizedBox(height: 16),
            TextField(
              decoration: InputDecoration(
                labelText: 'Only Lowercase Letters',
              ),
              inputFormatters: [
                FilteringTextInputFormatter.lettersOnly, // 仅允许字母输入
                LowerCaseTextInputFormatter(), // 强制转换为小写
              ],
            ),
          ],
        ),
      ),
    );
  }
}

// 自定义Formatter:强制文本为小写
class LowerCaseTextInputFormatter extends TextInputFormatter {
  @override
  TextEditingValue formatEditUpdate(
      TextEditingValue oldValue, TextEditingValue newValue) {
    if (newValue.text.isNotEmpty &&
        newValue.text.toLowerCase() != newValue.text) {
      return TextEditingValue(
        text: newValue.text.toLowerCase(),
        selection: newValue.selection,
      );
    }
    return newValue;
  }
}

解释

  1. LengthLimitingTextInputFormatter:限制文本输入的长度。在这个例子中,我们将长度限制为10个字符。
  2. FilteringTextInputFormatter.digitsOnly:仅允许数字输入。
  3. FilteringTextInputFormatter.lettersOnly:仅允许字母输入。
  4. LowerCaseTextInputFormatter:自定义的TextInputFormatter,用于将输入的文本强制转换为小写。

运行代码

将上述代码复制到你的Flutter项目的主文件(通常是main.dart)中,然后运行应用。你会看到三个TextField,分别用于限制文本长度、仅允许数字输入和仅允许小写字母输入。

这样,你就可以在Flutter应用中有效地使用TextInputFormatter来格式化文本输入了。

回到顶部