Flutter链接预览生成插件link_preview_generator的使用

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

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

贡献

欢迎贡献!请遵循以下步骤:

  1. Fork 项目
  2. 创建你的功能分支 (git checkout -b my-new-feature)
  3. 提交你的更改 (git commit -am 'Added some feature')
  4. 推送到分支 (git push origin my-new-feature)
  5. 创建新的 Pull Request

贡献者

Image of contributors

许可证

MIT License


更多关于Flutter链接预览生成插件link_preview_generator的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于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(() {});
  }
}

解释

  1. 依赖添加:确保在pubspec.yaml中添加了link_preview_generator依赖。
  2. UI布局:使用TextField来输入URL,并在输入改变时调用generatePreview函数生成预览。
  3. 生成预览generatePreview函数使用LinkPreviewGenerator类的getPreview方法异步获取链接预览数据。
  4. 显示预览:如果预览数据不为空,则显示标题、描述和图片。如果图片URL有效,则使用Image.network显示图片。

这个示例展示了如何使用link_preview_generator插件来获取和显示链接预览的基本步骤。你可以根据实际需求进一步自定义和扩展这个示例。

回到顶部