Flutter链接预览生成插件link_preview_generator的使用
Flutter链接预览生成插件link_preview_generator的使用
插件介绍
link_preview_generator
是一个跨平台的 Flutter 插件,用于将链接转换为丰富且美观的预览卡片。该插件灵感来源于 Any Link Preview
包,但整个解析和抓取逻辑已经重写,以更健壮并支持更多类型的链接。此外,它还提供了对小部件的完全自定义控制。
特点
- 支持多种链接类型
- 提供丰富的自定义选项
- 高效的缓存机制
- 易于使用的 API
使用方法
安装
在你的 pubspec.yaml
文件中添加以下依赖:
dependencies:
link_preview_generator: ^latest_version
示例代码
Widget 示例
以下是一个简单的示例,展示如何使用 LinkPreviewGenerator
小部件生成链接预览:
import 'package:flutter/material.dart';
import 'package:link_preview_generator/link_preview_generator.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Link Preview Generator Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: const MyHomePage(),
);
}
}
class MyHomePage extends StatefulWidget {
const MyHomePage({Key? key}) : super(key: key);
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
// 列表中的链接将被预览
List<String> get urls => const [
'https://github.com/ghpranav/link_preview_generator',
'https://www.espn.in/football/soccer-transfers/story/4163866/transfer-talk-lionel-messi-tells-barcelona-hes-more-likely-to-leave-then-stay',
'https://speakerdeck.com/themsaid/the-power-of-laravel-queues',
'https://twitter.com/laravelphp/status/1222535498880692225',
'https://www.youtube.com/watch?v=W1pNjxmNHNQ',
'https://www.instagram.com/p/CQ3WCUOru1T/',
'https://www.google.com/'
];
@override
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: Colors.white,
appBar: AppBar(
brightness: Brightness.dark,
title: Text('Link Preview Generator'),
),
body: ListView.builder(
itemCount: urls.length,
itemBuilder: (context, index) => Container(
key: ValueKey(urls[index]),
margin: const EdgeInsets.all(15),
// 生成每个链接的预览
// 交替显示大、小预览样式
child: LinkPreviewGenerator(
link: urls[index],
linkPreviewStyle: index % 2 == 0
? LinkPreviewStyle.large
: LinkPreviewStyle.small,
),
),
),
);
}
}
Function 示例
你也可以使用 LinkPreview
类的方法来获取链接的元数据,并根据这些数据构建自定义的小部件:
import 'package:flutter/material.dart';
import 'package:link_preview_generator/link_preview_generator.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Link Preview Generator Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: const MyHomePage(),
);
}
}
class MyHomePage extends StatefulWidget {
const MyHomePage({Key? key}) : super(key: key);
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
late Future<WebInfo> _webInfoFuture;
@override
void initState() {
super.initState();
_webInfoFuture = LinkPreview.scrapeFromURL('https://github.com/ghpranav/link_preview_generator');
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Link Preview Generator'),
),
body: Center(
child: FutureBuilder<WebInfo>(
future: _webInfoFuture,
builder: (context, snapshot) {
if (snapshot.connectionState == ConnectionState.waiting) {
return CircularProgressIndicator();
} else if (snapshot.hasError) {
return Text('Error: ${snapshot.error}');
} else if (!snapshot.hasData) {
return Text('No data found');
} else {
final WebInfo info = snapshot.data!;
return Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text(info.title ?? 'No title'),
Text(info.description ?? 'No description'),
Image.network(info.image ?? 'https://via.placeholder.com/150'),
Text('Domain: ${info.domain}'),
Text('Type: ${info.type}'),
Text('Video: ${info.video ?? 'No video'}'),
],
);
}
},
),
),
);
}
}
属性与方法
LinkPreviewGenerator
PropName | Description | PropType | Default Value | Required |
---|---|---|---|---|
link | 要显示为预览的 URL | String | - | true |
backgroundColor | 自定义小部件的背景颜色 | Color | Color.fromRGBO(248, 248, 248, 1.0) |
false |
bodyMaxLines | 描述正文的最大行数 | int | auto |
false |
bodyStyle | 自定义描述正文的样式 | TextStyle | - | false |
bodyTextOverflow | 描述正文文本的溢出类型 | TextOverflow | TextOverflow.ellipsis |
false |
borderRadius | 小部件卡片的圆角半径 | double | 12.0 |
false |
boxShadow | 小部件卡片的阴影 | List<BoxShadow> | - | false |
cacheDuration | 缓存解析结果的持续时间 | Duration | Duration(days: 7) |
false |
errorBody | 解析失败时显示的正文 | String | Oops! Unable to parse the url. |
false |
errorImage | 解析失败时显示的图像 URL | String | A crying semi-soccer ball image | false |
errorTitle | 解析失败时显示的标题 | String | Something went wrong! |
false |
errorWidget | 解析失败时显示的小部件 | Widget | - | false |
graphicFit | 调整图像的盒模型 | BoxFit | BoxFit.cover |
false |
linkPreviewStyle | 链接预览卡的显示样式 | LinkPreviewStyle | large |
false |
onTap | 用户点击卡片时调用的函数 | Function() | launchURL(link) |
false |
placeholderWidget | 解析链接时显示的小部件 | Widget | - | false |
proxyUrl | 传递以解决 Web 上的 CORS 问题的代理 URL | String | - | false |
removeElevation | 移除小部件卡片的阴影 | bool | false |
false |
showBody | 显示或隐藏正文(描述) | bool | true |
false |
showDomain | 显示或隐藏域名 | bool | true |
false |
showGraphic | 显示或隐藏解析后的图像(如果有) | bool | true |
false |
showTitle | 显示或隐藏标题 | bool | true |
false |
titleStyle | 自定义标题的样式 | TextStyle | - | false |
贡献
欢迎贡献!请遵循以下步骤:
- Fork 项目
- 创建你的功能分支 (
git checkout -b my-new-feature
) - 提交你的更改 (
git commit -am 'Added some feature'
) - 推送到分支 (
git push origin my-new-feature
) - 创建新的 Pull Request
贡献者
许可证
更多关于Flutter链接预览生成插件link_preview_generator的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter链接预览生成插件link_preview_generator的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,以下是如何在Flutter项目中使用link_preview_generator
插件来生成链接预览的一个代码示例。
首先,确保你已经在pubspec.yaml
文件中添加了link_preview_generator
依赖:
dependencies:
flutter:
sdk: flutter
link_preview_generator: ^最新版本号 # 请替换为当前最新版本号
然后运行flutter pub get
来获取依赖。
接下来,你可以在你的Flutter项目中按照以下步骤使用link_preview_generator
插件。
示例代码
import 'package:flutter/material.dart';
import 'package:link_preview_generator/link_preview_generator.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatefulWidget {
@override
_MyAppState createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
String? url;
LinkPreviewData? previewData;
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: Text('Link Preview Generator Demo'),
),
body: Padding(
padding: const EdgeInsets.all(16.0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
TextField(
decoration: InputDecoration(
labelText: 'Enter URL',
),
onChanged: (value) {
setState(() {
url = value;
if (value.isNotEmpty) {
generatePreview(value);
} else {
previewData = null;
}
});
},
),
SizedBox(height: 16.0),
if (previewData != null)
Padding(
padding: const EdgeInsets.symmetric(horizontal: 16.0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
'Title: ${previewData!.title}',
style: TextStyle(fontSize: 18, fontWeight: FontWeight.bold),
),
SizedBox(height: 8.0),
Text(
'Description: ${previewData!.description}',
style: TextStyle(fontSize: 16),
),
SizedBox(height: 8.0),
Text(
'Image URL: ${previewData!.imageUrl}',
style: TextStyle(fontSize: 16),
),
if (previewData!.imageUrl != null &&
Uri.tryParse(previewData!.imageUrl!) != null)
SizedBox(
height: 16.0,
child: Image.network(previewData!.imageUrl!),
),
],
),
),
],
),
),
),
);
}
Future<void> generatePreview(String url) async {
try {
final LinkPreviewGenerator generator = LinkPreviewGenerator();
previewData = await generator.getPreview(url);
} catch (e) {
print('Error generating preview: $e');
previewData = null;
}
setState(() {});
}
}
解释
- 依赖添加:确保在
pubspec.yaml
中添加了link_preview_generator
依赖。 - UI布局:使用
TextField
来输入URL,并在输入改变时调用generatePreview
函数生成预览。 - 生成预览:
generatePreview
函数使用LinkPreviewGenerator
类的getPreview
方法异步获取链接预览数据。 - 显示预览:如果预览数据不为空,则显示标题、描述和图片。如果图片URL有效,则使用
Image.network
显示图片。
这个示例展示了如何使用link_preview_generator
插件来获取和显示链接预览的基本步骤。你可以根据实际需求进一步自定义和扩展这个示例。