Flutter文本选择及自动链接识别插件selectable_autolink_text的使用

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

Flutter文本选择及自动链接识别插件selectable_autolink_text的使用

插件介绍

Selectable Autolink Text 是一个用于在Flutter应用程序中生成可选、可点击和长按操作的内联链接的插件。它可以帮助开发者轻松地将普通的文本转换为具有交互功能的链接,如网址、电话号码、电子邮件地址等,并且支持自定义链接样式。

安装

要安装此插件,请按照 官方文档 的说明进行配置。通常你需要在 pubspec.yaml 文件中添加依赖:

dependencies:
  selectable_autolink_text: ^最新版本号

然后运行命令 flutter pub get 来获取并解析新的依赖关系。

使用示例

以下是几个不同场景下如何使用 SelectableAutoLinkText 组件的具体例子。

基础用法

最简单的用法是直接传递包含链接的字符串给 SelectableAutoLinkText,并设置一些基本样式以及点击事件处理函数。

@override
Widget build(BuildContext context) {
  return SelectableAutoLinkText(
    'Basic https://flutter.dev',
    linkStyle: TextStyle(color: Colors.blueAccent),
    highlightedLinkStyle: TextStyle(
      color: Colors.blueAccent,
      backgroundColor: Colors.blueAccent.withAlpha(0x33),
    ),
    onTap: (url) => launchUrl(Uri.parse(url)),
    onLongPress: (url) => Share.share(url),
  );
}

高级用法

对于更复杂的文本内容,比如同时包含多种类型的链接(URL, Tel, Email),可以进一步定制样式和行为。

@override
Widget build(BuildContext context) {
  return SelectableAutoLinkText(
    '''
Advanced
You can shrink url like https://github.com/miyakeryo/flutter_selectable_autolink_text
tel: 012-3456-7890
email: mail@example.com''',
    style: TextStyle(color: Colors.green[800]),
    linkStyle: TextStyle(color: Colors.purpleAccent),
    highlightedLinkStyle: TextStyle(
      color: Colors.purpleAccent,
      backgroundColor: Colors.purpleAccent.withAlpha(0x33),
    ),
    onTransformDisplayLink: AutoLinkUtils.shrinkUrl,
    onTap: (url) async {
      print('🌶Tap: $url');
      final uri = Uri.parse(url);
      if (await canLaunchUrl(uri)) {
        launchUrl(uri);
      }
    },
    onLongPress: (url) {
      print('🍔LongPress: $url');
      Share.share(url);
    },
  );
}

自定义链接模式

如果你需要识别特定格式的链接,例如社交媒体标签或话题标签,可以通过正则表达式来定义自己的匹配规则。

@override
Widget build(BuildContext context) {
  return SelectableAutoLinkText(
    'Custom links'
    '\nHi! @screen_name.'
    ' If you customize the regular expression, you can make them.'
    ' #hash_tag',
    linkStyle: TextStyle(color: Colors.deepOrangeAccent),
    highlightedLinkStyle: TextStyle(
      color: Colors.deepOrangeAccent,
      backgroundColor: Colors.deepOrangeAccent.withAlpha(0x33),
    ),
    linkRegExpPattern: '(@[\\w]+|#[\\w]+|${AutoLinkUtils.urlRegExpPattern})',
    onTransformDisplayLink: AutoLinkUtils.shrinkUrl,
    onTap: (url) => print('🍒Tap: $url'),
    onLongPress: (url) => print('🍩LongPress: $url'),
  );
}

更高级的用法

这里展示了如何结合Markdown风格的语法创建更加灵活的链接样式。

@override
Widget build(BuildContext context) {
  final blueStyle = TextStyle(color: Colors.blueAccent);
  final highlightedStyle = TextStyle(
    color: Colors.blueAccent, 
    backgroundColor: Colors.blueAccent.withAlpha(0x33),
  );
  final orangeStyle = TextStyle(color: Colors.orange);
  final boldStyle = TextStyle(fontWeight: FontWeight.bold);
  final italicStyle = TextStyle(fontStyle: FontStyle.italic);
  final bigStyle = TextStyle(fontSize: 24);
  final regExpPattern = r'\[([^\]]+)\]\(([^\s\)]+)\)';
  final regExp = RegExp(regExpPattern);

  return SelectableAutoLinkText(
    '''
More advanced usage

[This is a link text](https://google.com)
[This text is bold](bold)
This text is normal
[This text is italic](italic)
[This text is orange](orange)
[This text is big](big)''',
    linkRegExpPattern: regExpPattern,
    onTransformDisplayLink: (s) {
      final match = regExp.firstMatch(s);
      if (match != null && match.groupCount == 2) {
        final text1 = match.group(1)!;
        final text2 = match.group(2)!;
        switch (text2) {
          case 'bold':
            return LinkAttribute(text1, style: boldStyle);
          case 'italic':
            return LinkAttribute(text1, style: italicStyle);
          case 'orange':
            return LinkAttribute(text1, style: orangeStyle);
          case 'big':
            return LinkAttribute(text1, style: bigStyle);
          default:
            if (text2.startsWith('http')) {
              return LinkAttribute(
                text1,
                link: text2,
                style: blueStyle,
                highlightedStyle: highlightedStyle,
              );
            } else {
              return LinkAttribute(text1);
            }
        }
      }
      return LinkAttribute(s);
    },
    onTap: (url) => launchUrl(Uri.parse(url)),
    onLongPress: (url) => Share.share(url),
  );
}

以上就是关于 SelectableAutolinkText 插件的基本介绍及其在不同情况下的使用方法。通过这些代码片段,你可以根据实际需求调整文本显示效果和交互逻辑。


更多关于Flutter文本选择及自动链接识别插件selectable_autolink_text的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter文本选择及自动链接识别插件selectable_autolink_text的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,下面是一个关于如何使用 selectable_autolink_text 插件在 Flutter 中实现文本选择和自动链接识别的代码示例。这个插件允许你对文本进行选择,并且自动识别和处理 URL、电子邮件、电话号码等链接。

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

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

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

接下来,在你的 Dart 文件中,你可以这样使用 SelectableAutolinkText 组件:

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Selectable Autolink Text Example'),
        ),
        body: Padding(
          padding: const EdgeInsets.all(16.0),
          child: SelectableAutolinkText(
            text: '''
            这是一个包含多种链接的示例文本。
            访问我们的网站:https://www.example.com,
            或者发送邮件到:test@example.com,
            或者拨打我们的电话:+123-456-7890。
            ''',
            linkStyle: TextStyle(color: Colors.blue, decoration: TextDecoration.underline),
            onLinkTap: (String url) {
              // 在这里处理链接点击事件,比如使用 url_launcher 打开链接
              // 如果需要,可以先检查 url 的类型(如 email, phone, url)
              if (url.startsWith('mailto:')) {
                // 处理邮件链接
                print('Email link tapped: $url');
              } else if (url.startsWith('tel:')) {
                // 处理电话链接
                print('Phone link tapped: $url');
              } else {
                // 处理普通 URL 链接
                // 示例:使用 url_launcher 打开 URL
                // import 'package:url_launcher/url_launcher.dart';
                // launch(url);
                print('URL link tapped: $url');
              }
            },
          ),
        ),
      ),
    );
  }
}

在这个示例中:

  1. 我们导入了 selectable_autolink_text 包。
  2. 使用 SelectableAutolinkText 组件来显示包含链接的文本。
  3. 通过 linkStyle 属性设置链接的样式。
  4. 通过 onLinkTap 回调函数处理链接点击事件。在这个回调函数中,你可以根据链接的类型(URL、电子邮件、电话号码)执行相应的操作。

注意:在实际应用中,如果你希望打开 URL 或拨打电话,可以使用 url_launcher 包。示例代码中已包含相关注释,你可以取消注释并根据需要进行调整。

希望这个示例能帮你更好地理解如何在 Flutter 中使用 selectable_autolink_text 插件。

回到顶部