Flutter正则表达式验证文本字段插件regex_pattern_text_field的使用

Flutter正则表达式验证文本字段插件 regex_pattern_text_field 的使用

RegexPatternTextField 是一个强大的 Flutter 小部件,它简化了在文本字段中进行模式匹配和应用样式的工作。这个小部件特别适用于高亮显示 URL、电子邮件、标签(hashtags)、提及(mentions)等模式。

regex_pattern_text_field

功能特性

  • 模式匹配:根据预定义或自定义的正则表达式模式识别并样式化文本。
  • 可定制样式:为每个匹配的模式应用独特的文本样式。
  • 实时更新:动态监控并响应输入的变化。
  • 可扩展性:轻松添加新的正则表达式模式及其对应的样式。

开始使用

安装

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

dependencies:
  regex_pattern_text_field: ^1.0.0

运行以下命令来获取包:

flutter pub get
导入包

在 Dart 文件中导入 regex_pattern_text_field 包:

import 'package:regex_pattern_text_field/regex_pattern_text_field.dart';

使用方法

基本示例

将标准的 TextField 替换为 RegexPatternTextField,并使用 RegexPatternTextStyle 定义模式和样式。

RegexPatternTextField(
  maxLines: null,
  regexPatternController: _controller,
  onChanged: (matches, text) {
    print("Text changed: $text");
  },
  onSubmitted: (matches, text) {
    print("Text submitted: $text");
  },
  defaultRegexPatternStyles: true,
  regexPatternStyles: [
    RegexPatternTextStyle(
      type: "email",
      regexPattern: r"[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}",
      textStyle: const TextStyle(color: Colors.blue, fontWeight: FontWeight.bold),
    ),
    RegexPatternTextStyle(
      type: "hashtag",
      regexPattern: r"#\w+",
      textStyle: const TextStyle(color: Colors.green, fontStyle: FontStyle.italic),
    ),
  ],
  onMatch: (model) {
    print("Matched pattern: ${model.type}, Text: ${model.text}");
  },
  onNonMatch: (text) {
    print("No match for: $text");
  },
);

回调函数

  • onMatch:当正则表达式模式匹配到部分文本时触发,提供详细的匹配信息。
  • onNonMatch:当没有模式匹配到文本时调用。
  • onChanged:每次文本变化时执行,提供实时反馈。
  • onSubmitted:当用户提交文本时(例如按下回车键)调用。

自定义

添加新模式

可以动态定义额外的模式:

RegexPatternTextStyle(
  type: "customPattern",
  regexPattern: r"\d{4}-\d{2}-\d{2}", // 匹配 YYYY-MM-DD 格式的日期
  textStyle: const TextStyle(color: Colors.orange, fontWeight: FontWeight.bold),
);
组合默认和自定义样式

可以在启用默认样式的同时添加自定义样式:

RegexPatternTextField(
  defaultRegexPatternStyles: true,
  regexPatternStyles: [
    // 在这里添加自定义样式
  ],
);

完整示例应用

以下是一个完整的示例应用,展示了如何使用 RegexPatternTextField

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

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

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

  [@override](/user/override)
  Widget build(BuildContext context) {
    return const MaterialApp(
      home: RegexPatternDemo(),
    );
  }
}

class RegexPatternDemo extends StatefulWidget {
  const RegexPatternDemo({Key? key}) : super(key: key);

  [@override](/user/override)
  State<RegexPatternDemo> createState() => _RegexPatternDemoState();
}

class _RegexPatternDemoState extends State<RegexPatternDemo> {
  final RegexPatternTextEditingController _controller = RegexPatternTextEditingController();
  List<RegexPatternMatched> matches = [];

  [@override](/user/override)
  void initState() {
    super.initState();
    _controller.addListener(() {
      setState(() {
        matches = _controller.regexPatternMatchedList;
      });
    });
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('Regex Pattern Text Field'),
      ),
      body: Column(
        children: [
          Padding(
            padding: const EdgeInsets.all(16.0),
            child: RegexPatternTextField(
              maxLines: null,
              regexPatternController: _controller,
              onChanged: (matches, text) => debugPrint("Text changed: $text"),
              regexPatternStyles: [
                RegexPatternTextStyle(
                  type: "email",
                  regexPattern: r"[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}",
                  textStyle: const TextStyle(color: Colors.blue),
                ),
              ],
            ),
          ),
          Expanded(
            child: ListView.builder(
              itemCount: matches.length,
              itemBuilder: (context, index) {
                final match = matches[index];
                return ListTile(
                  title: Text("Matched Text: ${match.text}"),
                  subtitle: Text("Type: ${match.type}"),
                );
              },
            ),
          ),
        ],
      ),
    );
  }
}

更多关于Flutter正则表达式验证文本字段插件regex_pattern_text_field的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter正则表达式验证文本字段插件regex_pattern_text_field的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是如何在Flutter中使用regex_pattern_text_field插件进行正则表达式验证文本字段的示例代码。首先,你需要确保已经在pubspec.yaml文件中添加了regex_pattern_text_field依赖:

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

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

以下是一个完整的Flutter应用示例,展示了如何使用regex_pattern_text_field插件来验证电子邮件地址格式的文本字段:

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

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

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

class EmailValidationForm extends StatefulWidget {
  @override
  _EmailValidationFormState createState() => _EmailValidationFormState();
}

class _EmailValidationFormState extends State<EmailValidationForm> {
  final GlobalKey<FormState> _formKey = GlobalKey<FormState>();
  String _email = '';
  String _errorMessage = '';

  @override
  Widget build(BuildContext context) {
    return Form(
      key: _formKey,
      child: Column(
        mainAxisAlignment: MainAxisAlignment.center,
        children: <Widget>[
          RegexPatternTextField(
            keyboardType: TextInputType.emailAddress,
            decoration: InputDecoration(
              labelText: 'Email',
              errorText: _errorMessage,
            ),
            pattern:
                r'^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$', // 简单的电子邮件正则表达式
            errorText: '请输入有效的电子邮件地址',
            onChanged: (value) {
              setState(() {
                _email = value;
                _errorMessage = null; // 清除错误信息
              });
            },
            validator: (value) {
              if (value.isEmpty) {
                setState(() {
                  _errorMessage = '电子邮件地址不能为空';
                });
                return null;
              } else if (!RegExp(r'^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$')
                  .hasMatch(value)) {
                setState(() {
                  _errorMessage = '请输入有效的电子邮件地址';
                });
                return null;
              }
              return null;
            },
          ),
          SizedBox(height: 20),
          ElevatedButton(
            onPressed: () {
              if (_formKey.currentState!.validate()) {
                // 执行提交逻辑,例如打印电子邮件地址
                print('Email: $_email');
              }
            },
            child: Text('提交'),
          ),
        ],
      ),
    );
  }
}

在这个示例中,我们创建了一个简单的表单,包含一个使用RegexPatternTextField的文本字段。RegexPatternTextFieldpattern属性用于指定正则表达式,这里是用于验证电子邮件地址的简单正则表达式。errorText属性定义了当输入不匹配正则表达式时显示的错误消息。

注意,虽然RegexPatternTextField提供了内置的验证功能,但在这个示例中,我仍然添加了validator回调来演示如何在表单验证中使用自定义逻辑。这可以帮助你在RegexPatternTextField的基础上添加额外的验证条件。

请确保根据实际需求调整正则表达式和UI设计。

回到顶部