Flutter电话号码格式化输入插件phone_number_text_input_formatter的使用

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

Flutter电话号码格式化输入插件phone_number_text_input_formatter的使用

这个是用于在文本输入时提供电话号码格式化的Flutter插件。它是一个关键辅助工具,用于创建需要限制和验证用户输入格式的电话号码输入字段。

特性

  • 零依赖
  • 高效地实时格式化电话号码,性能优于基于正则表达式的解决方案。
  • 可以根据需要自定义格式,给你更多的灵活性和控制。
  • 提供了预实现的流行国际和国家电话号码格式。

使用方法

格式化所有可用的国际格式

TextField(
  keyboardType: TextInputType.phone,
  inputFormatters: [
    FilteringTextInputFormatter.allow(RegExp(r'[0-9,+]')), // 允许输入数字和加号
    const PhoneNumberTextInputFormatter(prefix: '+'), // 设置前缀为 +
  ],
)

格式化美国电话号码(国际格式)

TextField(
  keyboardType: TextInputType.phone,
  inputFormatters: [
    FilteringTextInputFormatter.allow(RegExp(r'[0-9,+]')), // 允许输入数字和加号
    const NationalPhoneNumberTextInputFormatter.US(prefix: '+'), // 设置前缀为 +,并使用美国格式
  ],
)

自定义电话号码格式

TextField(
  keyboardType: TextInputType.phone,
  inputFormatters: [
    FilteringTextInputFormatter.allow(RegExp(r'[0-9,+]')), // 允许输入数字和加号
    const NationalPhoneNumberTextInputFormatter(
      prefix: '+',
      countryCode: '28', // 国家码为28
      groups: [
        (length: 4, leading: ' [', trailing: '] '), // 每4个字符后添加 "[ ] "
        (length: 3, leading: '', trailing: '-'), // 每3个字符后添加 "-"
        (length: 3, leading: '', trailing: ' '), // 每3个字符后添加 " "
      ],
    ),
  ],
)

完整示例Demo

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

import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:phone_number_text_input_formatter/phone_number_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: 'Phone Number Text Input Formatter Demo',
      theme: ThemeData(
        colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
        useMaterial3: true,
      ),
      home: const ExamplePage(title: 'Phone Number Text Input Formatter Demo Home Page'),
    );
  }
}

class ExamplePage extends StatelessWidget {
  final String title;
  const ExamplePage({super.key, required this.title});

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        backgroundColor: Theme.of(context).colorScheme.inversePrimary,
        title: Text(title),
      ),
      body: Padding(
        padding: const EdgeInsets.all(32.0),
        child: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: [
              TextField(
                decoration: const InputDecoration(
                  labelText: 'All supported countries',
                  helperText: ' '
                ),
                inputFormatters: [
                  FilteringTextInputFormatter.allow(RegExp(r'[0-9,+]')), // 允许输入数字和加号
                  const PhoneNumberTextInputFormatter(prefix: '+'), // 设置前缀为 +
                ],
              ),
              TextField(
                decoration: const InputDecoration(
                  labelText: 'US',
                  hintText: '+1 (000) 000-0000',
                  helperText: ' '
                ),
                inputFormatters: [
                  FilteringTextInputFormatter.allow(RegExp(r'[0-9,+]')), // 允许输入数字和加号
                  const NationalPhoneNumberTextInputFormatter.US(prefix: '+'), // 设置前缀为 +,并使用美国格式
                ],
              ),
              TextField(
                decoration: const InputDecoration(
                  labelText: 'Denmark',
                  hintText: '+45 00 000 0000',
                  helperText: 'Default format'
                ),
                inputFormatters: [
                  FilteringTextInputFormatter.allow(RegExp(r'[0-9,+]')), // 允许输入数字和加号
                  NationalPhoneNumberTextInputFormatter.DK(prefix: '+'), // 使用丹麦格式
                ],
              ),
              TextField(
                decoration: const InputDecoration(
                  labelText: 'Custom',
                  hintText: '+28 [0000] 000-000',
                ),
                inputFormatters: [
                  FilteringTextInputFormatter.allow(RegExp(r'[0-9,+]')), // 允许输入数字和加号
                  const NationalPhoneNumberTextInputFormatter(
                    prefix: '+',
                    countryCode: '28', // 国家码为28
                    groups: [
                      (length: 4, leading: ' [', trailing: '] '), // 每4个字符后添加 "[ ] "
                      (length: 3, leading: '', trailing: '-'), // 每3个字符后添加 "-"
                      (length: 3, leading: '', trailing: ' '), // 每3个字符后添加 " "
                    ],
                  ),
                ],
              )
            ],
          ),
        ),
      ),
    );
  }
}

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

1 回复

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


当然,下面是一个关于如何使用 phone_number_text_input_formatter 插件在 Flutter 中实现电话号码格式化输入的示例代码。

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

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

然后运行 flutter pub get 来获取依赖。

接下来,在你的 Dart 文件中使用 PhoneNumberTextInputFormatter。这里是一个完整的示例:

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Phone Number Formatting Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: Scaffold(
        appBar: AppBar(
          title: Text('Phone Number Formatting Demo'),
        ),
        body: Center(
          child: Padding(
            padding: const EdgeInsets.all(16.0),
            child: PhoneNumberInputField(),
          ),
        ),
      ),
    );
  }
}

class PhoneNumberInputField extends StatefulWidget {
  @override
  _PhoneNumberInputFieldState createState() => _PhoneNumberInputFieldState();
}

class _PhoneNumberInputFieldState extends State<PhoneNumberInputField> {
  final TextEditingController _controller = TextEditingController();

  @override
  Widget build(BuildContext context) {
    return TextField(
      controller: _controller,
      keyboardType: TextInputType.phone,
      decoration: InputDecoration(
        labelText: 'Enter Phone Number',
        prefixIcon: Icon(Icons.phone),
      ),
      inputFormatters: [
        FilteringTextInputFormatter.digitsOnly, // 仅允许输入数字
        PhoneNumberTextInputFormatter(
          keyboardAppearance: Brightness.light, // 设置键盘外观(可选)
          withCountryCode: false, // 是否包含国家代码(可选)
          inputFormat: PhoneNumberFormat.international, // 设置输入格式(可选)
        ),
      ],
    );
  }

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

在这个示例中,我们创建了一个简单的 Flutter 应用,其中包含一个 TextField,用于输入电话号码。TextField 使用了 PhoneNumberTextInputFormatter 来格式化输入的电话号码。

  • FilteringTextInputFormatter.digitsOnly 确保用户只能输入数字。
  • PhoneNumberTextInputFormatter 负责格式化输入的电话号码。你可以通过调整其参数来改变格式化的行为,例如是否包含国家代码,以及输入格式(国际格式、E.164格式等)。

这样,当用户输入电话号码时,它会自动按照设定的格式进行格式化。例如,如果你选择的是国际格式,当用户输入 +1234567890 时,它会自动格式化为 +1 234 567 890(具体格式取决于你的设置)。

回到顶部