Flutter文本链接识别插件linkify_plus的使用
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",
),
),
),
);
}
}
完整示例
下面是一个完整的示例,展示如何使用 Linkify
和 SelectableLinkify
:
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
更多关于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;
}
}
}
解释
- 添加依赖:在
pubspec.yaml
中添加linkify_plus
依赖。 - 导入插件:在Dart文件中导入
linkify_plus
。 - 使用LinkifyPlus:
LinkifyPlus
组件接受一个包含链接的文本字符串。onOpen
回调用于处理链接点击事件,这里使用launch
函数来打开浏览器。text
属性是包含链接的原始文本。style
和linkStyle
分别设置普通文本和链接文本的样式。buildSpan
属性允许你自定义如何构建链接文本,这里使用TextSpan
和TapGestureRecognizer
来识别点击事件。
这个示例展示了如何在Flutter应用中使用linkify_plus
插件来识别和处理文本中的链接,并处理点击事件。你可以根据需要进一步自定义和扩展这个示例。