Flutter文本解析插件flutter_parsed_text的使用

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

Flutter文本解析插件flutter_parsed_text的使用

Flutter Parsed text 是一个用于解析和提取文本中特定模式部分(如URL、电话号码、电子邮件等)的插件,它也支持正则表达式。

使用方法 💻

要在项目中使用这个插件,首先需要在pubspec.yaml文件中添加flutter_parsed_text作为依赖项:

dependencies:
  flutter_parsed_text: ^latest_version # 请替换为最新版本号

然后,在Dart文件中导入包:

import 'package:flutter_parsed_text/flutter_parsed_text.dart';

参数说明 ⚙️

  • text: 将要被解析并渲染的文本。
  • style: 用于设置所有非链接文本样式的TextStyle对象。
  • parse: 包含MatchText对象的数组,用于定义模式匹配结构。

MatchText 对象参数

  • type: 预定义类型,可以是ParsedType.URL, ParsedType.EMAIL, ParsedType.PHONE 或者自定义类型ParsedType.CUSTOM
  • pattern: 自定义正则表达式字符串。
  • regexOptions: 正则表达式的选项配置。
  • style: 应用到匹配文本上的样式。
  • renderText: 当匹配到特定模式时返回显示文本与值的映射。
  • onTap: 点击事件触发后执行的动作。

例如,我们可以创建一个简单的MatchText对象来处理电子邮件地址:

MatchText(
  type: ParsedType.EMAIL, 
  style: TextStyle(color: Colors.red, fontSize: 24),
  onTap: (url) {
    launch("mailto:" + url);
  },
)

对于更复杂的场景,比如用户提及(mention),我们可以通过正则表达式来匹配并处理:

MatchText(
  pattern: r"\[(@[^:]+):([^\]]+)\]",
  style: TextStyle(color: Colors.green, fontSize: 24),
  renderText: ({required pattern, required str}) {
    RegExp customRegExp = RegExp(r"\[(@[^:]+):([^\]]+)\]");
    Match match = customRegExp.firstMatch(str)!;
    return {'display': match.group(1)!};
  },
  onTap: (url) {
    // 显示对话框提示用户点击了哪个提及
    showDialog(...);
  },
)

示例代码 ✍🏻

下面是一个完整的例子,展示了如何使用ParsedText小部件来解析包含多种类型的文本,并为不同类型的文本提供不同的样式和交互行为:

import 'package:flutter/material.dart';
import 'package:flutter_parsed_text/flutter_parsed_text.dart';
import 'package:url_launcher/url_launcher.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Example App',
      home: MainApp(),
    );
  }
}

class MainApp extends StatefulWidget {
  @override
  _MainAppState createState() => _MainAppState();
}

class _MainAppState extends State<MainApp> {
  final parseRules = <MatchText>[
    // 解析邮件地址
    MatchText(
      type: ParsedType.EMAIL,
      style: TextStyle(color: Colors.red, fontSize: 24),
      onTap: (email) async {
        await launch("mailto:$email");
      },
    ),
    // 解析URL
    MatchText(
      type: ParsedType.URL,
      style: TextStyle(color: Colors.blue, fontSize: 24),
      onTap: (url) async {
        if (await canLaunch(url)) {
          await launch(url);
        }
      },
    ),
    // 解析电话号码
    MatchText(
      type: ParsedType.PHONE,
      style: TextStyle(color: Colors.red, fontSize: 24),
      onTap: (phone) async {
        await launch("tel:$phone");
      },
    ),
    // 解析用户提及
    MatchText(
      pattern: r"\[(@[^:]+):([^\]]+)\]",
      style: TextStyle(color: Colors.green, fontSize: 24),
      renderText: ({required pattern, required str}) {
        RegExp customRegExp = RegExp(r"\[(@[^:]+):([^\]]+)\]");
        Match match = customRegExp.firstMatch(str)!;
        return {'display': match.group(1)!};
      },
      onTap: (mention) {
        // 弹出对话框通知用户点击了哪个提及
        showDialog(
          context: context,
          builder: (_) => AlertDialog(
            title: Text('Mention Clicked'),
            content: Text('${mention.split(':')[0]} clicked.'),
            actions: [
              TextButton(
                onPressed: () => Navigator.pop(context),
                child: Text('Close'),
              ),
            ],
          ),
        );
      },
    ),
    // 解析话题标签
    MatchText(
      pattern: r"\B#+([\w]+)\b",
      style: TextStyle(color: Colors.pink, fontSize: 24),
      onTap: (hashtag) {
        // 弹出对话框通知用户点击了哪个话题标签
        showDialog(
          context: context,
          builder: (_) => AlertDialog(
            title: Text('Hashtag Clicked'),
            content: Text('$hashtag clicked.'),
            actions: [
              TextButton(
                onPressed: () => Navigator.pop(context),
                child: Text('Close'),
              ),
            ],
          ),
        );
      },
    ),
  ];

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('Parsed Text Example')),
      body: Padding(
        padding: const EdgeInsets.all(8.0),
        child: ParsedText(
          text: "[@michael:51515151] Hello this is an example of the ParsedText, links like http://www.google.com or http://www.facebook.com are clickable and phone number 444-555-6666 can call too. But you can also do more with this package, for example Bob will change style and David too. foo@gmail.com And the magic number is 42! #react #react-native",
          parse: parseRules,
          style: TextStyle(fontSize: 18),
        ),
      ),
    );
  }
}

这段代码实现了对文本中的邮箱、网址、电话号码、用户提及以及话题标签的支持,并且为每个类型设置了不同的样式和点击事件。你可以根据自己的需求调整规则列表parseRules中的内容。


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

1 回复

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


当然,以下是一个关于如何使用Flutter文本解析插件flutter_parsed_text的示例代码。这个插件允许你解析和渲染富文本内容,非常适合用于显示带有不同样式(如粗体、斜体、链接等)的文本。

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

dependencies:
  flutter:
    sdk: flutter
  flutter_parsed_text: ^2.0.0  # 请根据需要检查最新版本

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

接下来,是一个简单的示例代码,展示如何使用flutter_parsed_text插件:

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

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

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

class MyHomePage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    // 定义一个包含不同样式文本的字符串
    String parsedText = """
    Hello [bold]World[/bold]! Welcome to [italic]Flutter[/italic] parsed text example.
    Visit our [url]website[/url] for more info.
    """;

    // 使用ParsedText.fromJson方法解析并渲染文本
    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter Parsed Text Example'),
      ),
      body: Center(
        child: ParsedText.fromJson(
          ParsedTextData(
            text: parsedText,
            style: TextStyle(fontSize: 18),
            linksStyle: TextStyle(color: Colors.blue, decoration: TextDecoration.underline),
            bold: (textStyle) => textStyle.copyWith(fontWeight: FontWeight.bold),
            italic: (textStyle) => textStyle.copyWith(fontStyle: FontStyle.italic),
            url: (url, textStyle, onTap) {
              return GestureDetector(
                onTap: () {
                  // 处理URL点击事件,例如打开浏览器
                  // 这里为了简单起见,只打印URL
                  print('Opening URL: $url');
                },
                child: Text(
                  url,
                  style: textStyle.copyWith(color: Colors.blue, decoration: TextDecoration.underline),
                ),
              );
            },
          ),
        ),
      ),
    );
  }
}

在这个示例中:

  1. 我们定义了一个包含不同样式标记(如[bold][/bold][italic][/italic][url])的字符串parsedText
  2. 使用ParsedText.fromJson方法来解析这个字符串,并应用相应的样式。
  3. ParsedTextData类允许我们配置文本的基本样式(如字体大小)、链接样式,以及如何处理粗体、斜体和URL点击事件。
  4. 对于URL点击事件,我们使用GestureDetector来捕获点击并处理(在这个例子中,只是打印URL)。

运行这个示例应用,你会看到一个包含不同样式文本的界面,点击链接会在控制台打印URL。

这个示例展示了flutter_parsed_text插件的基本用法,你可以根据需要进一步自定义和扩展。

回到顶部