Flutter文本链接识别插件linkify_plus的使用

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

Flutter文本链接识别插件 linkify_plus 的使用

linkify_plus 是一个用于Flutter的插件,它能够将文本中的URL和电子邮件地址转换为可点击的内联链接。该插件支持Dart >= 2.12,并且具有空安全特性。

安装

在你的 pubspec.yaml 文件中添加以下依赖:

dependencies:
  linkify_plus: ^5.0.2

推荐同时添加 url_launcher 依赖以在浏览器或操作系统中打开链接:

dependencies:
  url_launcher: ^6.0.3

使用示例

基本用法

导入 linkify_plus 并使用 Linkify 小部件来显示文本链接:

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

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: Text('Linkify Example')),
        body: Center(
          child: Linkify(
            onOpen: (link) => print("Clicked ${link.url}!"),
            text: "Made by https://cretezy.com",
          ),
        ),
      ),
    );
  }
}

样式设置

你可以自定义非链接文本和链接文本的样式,并使用 url_launcher 打开链接:

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

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: Text('Linkify with Style')),
        body: Center(
          child: Linkify(
            onOpen: (link) async {
              if (await canLaunch(link.url)) {
                await launch(link.url);
              } else {
                throw 'Could not launch $link';
              }
            },
            text: "Made by https://cretezy.com",
            style: TextStyle(color: Colors.yellow),
            linkStyle: TextStyle(color: Colors.red),
          ),
        ),
      ),
    );
  }
}

高级选项

可以通过 options 参数控制是否启用 URL 人性化(去除 http://https://):

Linkify(
  text: "Made by https://cretezy.com",
  options: LinkifyOptions(humanize: false),
);

可选文本

使用 SelectableLinkify 小部件创建可选择的文本:

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

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: Text('Selectable Linkify')),
        body: Center(
          child: SelectableLinkify(
            text: "Made by https://cretezy.com\n\nMail: example@gmail.com",
          ),
        ),
      ),
    );
  }
}

完整示例

下面是一个完整的示例,展示如何使用 LinkifySelectableLinkify

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

void main() => runApp(LinkifyExample());

class LinkifyExample extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      title: 'linkify_plus example',
      home: Scaffold(
        appBar: AppBar(title: const Text('linkify_plus example')),
        body: Column(
          mainAxisAlignment: MainAxisAlignment.spaceEvenly,
          children: <Widget>[
            Center(
              child: Linkify(
                onOpen: _onOpen,
                textScaleFactor: 2,
                text:
                    "Hi Jane,Please be advised your team has added a new educational resource \n#https://preprod.caremonitor.com.au/links/?c=UI0b5V0#Falls prevention – eyesight# to your resource library. ",
              ),
            ),
            Center(
              child: Linkify(
                onOpen: _onOpen,
                textScaleFactor: 2,
                text: "Made by #https://cretezy.com#falls#",
              ),
            ),
            Center(
              child: SelectableLinkify(
                onOpen: _onOpen,
                textScaleFactor: 4,
                text: 'Hello @JohnDoe, did you see what @JaneDoe posted?',
              ),
            ),
          ],
        ),
      ),
    );
  }

  Future<void> _onOpen(LinkableElement link) async {
    if (await canLaunch(link.url)) {
      await launch(link.url);
    } else {
      throw 'Could not launch $link';
    }
  }
}

以上示例展示了如何在Flutter应用中集成并使用 linkify_plus 插件,实现文本链接的自动识别与处理。


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

1 回复

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


当然,以下是如何在Flutter项目中使用linkify_plus插件来识别和处理文本中的链接的示例代码。

1. 添加依赖

首先,在你的pubspec.yaml文件中添加linkify_plus依赖:

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

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

2. 导入插件

在你的Dart文件中导入linkify_plus

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

3. 使用LinkifyPlus

下面是一个完整的示例,展示如何在Flutter应用中识别和处理文本中的链接:

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Linkify Plus Example'),
        ),
        body: LinkifyPlusExample(),
      ),
    );
  }
}

class LinkifyPlusExample extends StatelessWidget {
  final String textWithLinks = "Check out Flutter's website at https://flutter.dev and follow us on Twitter @flutterdev.";

  @override
  Widget build(BuildContext context) {
    return Padding(
      padding: const EdgeInsets.all(16.0),
      child: LinkifyPlus(
        onOpen: (link) {
          // 处理链接点击事件,例如打开浏览器
          if (await canLaunch(link.url)) {
            await launch(link.url);
          } else {
            ScaffoldMessenger.of(context).showSnackBar(
              SnackBar(content: Text('Could not launch $link')),
            );
          }
        },
        text: textWithLinks,
        style: TextStyle(color: Colors.blue, fontSize: 18),
        linkStyle: TextStyle(color: Colors.red, underline: TextDecoration.underline),
        buildSpan: (context, link) {
          return TextSpan(
            text: link.text,
            style: link.style,
            recognizer: TapGestureRecognizer()
              ..onTap = () {
                onOpenLink(link);
              },
          );
        },
      ),
    );
  }

  Future<void> onOpenLink(LinkifyElement link) async {
    // 自定义链接打开逻辑,可以替换上面的onOpen回调
    if (await canLaunch(link.url)) {
      await launch(link.url);
    } else {
      ScaffoldMessenger.of(context).showSnackBar(
        SnackBar(content: Text('Could not launch ${link.url}')),
      );
    }
  }

  Future<bool> canLaunch(String url) async {
    if (await canLaunchUrl(Uri.parse(url))) {
      return true;
    } else if (await canLaunchUrl(Uri.parse('http://$url'))) {
      return true;
    } else if (await canLaunchUrl(Uri.parse('https://$url'))) {
      return true;
    } else {
      return false;
    }
  }
}

解释

  1. 添加依赖:在pubspec.yaml中添加linkify_plus依赖。
  2. 导入插件:在Dart文件中导入linkify_plus
  3. 使用LinkifyPlus
    • LinkifyPlus组件接受一个包含链接的文本字符串。
    • onOpen回调用于处理链接点击事件,这里使用launch函数来打开浏览器。
    • text属性是包含链接的原始文本。
    • stylelinkStyle分别设置普通文本和链接文本的样式。
    • buildSpan属性允许你自定义如何构建链接文本,这里使用TextSpanTapGestureRecognizer来识别点击事件。

这个示例展示了如何在Flutter应用中使用linkify_plus插件来识别和处理文本中的链接,并处理点击事件。你可以根据需要进一步自定义和扩展这个示例。

回到顶部