Flutter元数据获取插件metadata_fetch的使用

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

Flutter元数据获取插件metadata_fetch的使用

metadata_fetch 是一个用于从网页中提取元数据的Dart库。它支持OpenGraph、Meta标签、Twitter Cards和结构化数据(Json-LD)等格式。

Pub Dev地址

元数据结构

Metadata:
  - title
  - description
  - image
  - url

使用方法

通过给定URL提取元数据

以下是通过指定URL来提取页面元数据的简单示例:

import 'package:metadata_fetch/metadata_fetch.dart';

void main() async {
  final myURL = 'https://flutter.dev';

  // 使用 `MetadataFetch.extract()` 函数从URL获取数据
  var data = await MetadataFetch.extract(myURL);

  print(data.title); // 输出标题
  print(data.description); // 输出描述
  print(data.image); // 输出图片链接
  print(data.url); // 输出页面URL

  // 将元数据转换为Map格式
  var dataAsMap = data.toMap();
  print(dataAsMap);
}

手动解析文档中的元数据

获取聚合的元数据

此方法优先从Open Graph数据中获取信息,其次是Twitter Card、JSON-LD,最后是HTML元数据。

import 'package:metadata_fetch/metadata_fetch.dart';
import 'package:http/http.dart' as http;

void main() async {
  final myURL = 'https://flutter.dev';

  // 发起HTTP请求
  var response = await http.get(Uri.parse(myURL));

  // 将响应转换为Document对象
  var document = MetadataFetch.responseToDocument(response);

  // 获取聚合后的元数据
  var data = MetadataParser.parse(document);
  print(data);
}

指定使用的元数据解析器

可以手动选择不同的解析器来获取特定类型的元数据。

import 'package:metadata_fetch/metadata_fetch.dart';
import 'package:http/http.dart' as http;

void main() async {
  final myURL = 'https://flutter.dev';

  // 发起HTTP请求
  var response = await http.get(Uri.parse(myURL));

  // 将响应转换为Document对象
  var document = MetadataFetch.responseToDocument(response);

  // 获取不同类型的元数据
  var ogData = MetadataParser.OpenGraph(document);
  print('OpenGraph Data:');
  print(ogData);

  var htmlData = MetadataParser.HtmlMeta(document);
  print('HTML Meta Data:');
  print(htmlData);

  var structuredData = MetadataParser.JsonLdSchema(document);
  print('Structured Data:');
  print(structuredData);

  var twitterCardData = MetadataParser.TwitterCard(document);
  print('Twitter Card Data:');
  print(twitterCardData);
}

提供备用URL进行手动解析

当解析器无法从文档中提取URL时,可以通过MetadataFetch.parse()提供一个备用URL。

import 'package:metadata_fetch/metadata_fetch.dart';
import 'package:http/http.dart' as http;

void main() async {
  final myURL = 'https://flutter.dev';

  // 发起HTTP请求
  var response = await http.get(Uri.parse(myURL));

  // 将响应转换为Document对象
  var document = MetadataFetch.responseToDocument(response);

  // 获取聚合后的元数据,并提供备用URL
  var data = MetadataParser.parse(document, url: myURL);
  print(data);
}

示例代码

下面是一个完整的示例程序,展示了如何使用metadata_fetch插件来提取并打印出指定网站的元数据:

import 'package:metadata_fetch/metadata_fetch.dart';

void main() async {
  try {
    var data = await MetadataFetch.extract('https://flutter.dev');
    print('Title: ${data?.title}');
    print('Description: ${data?.description}');
    print('Image: ${data?.image}');
    print('URL: ${data?.url}');
    
    // 转换为Map或JSON格式
    print('As Map: ${data?.toMap()}');
    print('As JSON: ${data?.toJson()}');
  } catch (e) {
    print('Error occurred: $e');
  }
}

致谢

本库受到open_graph_parser项目的启发,但试图更加通用。

路线图

  • 增加对权重或优先级元数据的支持,允许为每个解析器分配自定义权重以提供回退优先系统。
  • 改进文档。

问题、错误和功能请求

有关此项目的所有查询,请提交至issue tracker


更多关于Flutter元数据获取插件metadata_fetch的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter元数据获取插件metadata_fetch的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是如何在Flutter项目中使用metadata_fetch插件来获取设备元数据的代码示例。metadata_fetch插件允许你获取设备的各种信息,如操作系统版本、设备型号、屏幕信息等。

首先,你需要在pubspec.yaml文件中添加metadata_fetch依赖:

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

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

接下来,在你的Flutter项目中使用metadata_fetch插件。以下是一个完整的示例,展示如何获取并显示设备的元数据:

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Metadata Fetch Example',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MetadataScreen(),
    );
  }
}

class MetadataScreen extends StatefulWidget {
  @override
  _MetadataScreenState createState() => _MetadataScreenState();
}

class _MetadataScreenState extends State<MetadataScreen> {
  Metadata? _metadata;

  @override
  void initState() {
    super.initState();
    _fetchMetadata();
  }

  Future<void> _fetchMetadata() async {
    try {
      final metadata = await MetadataFetch.deviceMetadata;
      setState(() {
        _metadata = metadata;
      });
    } catch (e) {
      print('Error fetching metadata: $e');
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Device Metadata'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: _metadata == null
            ? Center(child: CircularProgressIndicator())
            : Column(
                crossAxisAlignment: CrossAxisAlignment.start,
                children: [
                  Text('Operating System: ${_metadata!.operatingSystem}'),
                  SizedBox(height: 8),
                  Text('OS Version: ${_metadata!.osVersion}'),
                  SizedBox(height: 8),
                  Text('Brand: ${_metadata!.brand}'),
                  SizedBox(height: 8),
                  Text('Model: ${_metadata!.model}'),
                  SizedBox(height: 8),
                  Text('Screen Size: ${_metadata!.screenSize}'),
                  SizedBox(height: 8),
                  Text('Screen Density: ${_metadata!.screenDensity}'),
                ],
              ),
      ),
    );
  }
}

在这个示例中,我们做了以下事情:

  1. pubspec.yaml文件中添加了metadata_fetch依赖。
  2. 创建了一个Flutter应用,其中包含一个主屏幕MetadataScreen
  3. MetadataScreeninitState方法中调用_fetchMetadata函数来获取设备元数据。
  4. 使用MetadataFetch.deviceMetadata异步获取设备元数据,并在获取成功后更新状态。
  5. 在UI中显示获取到的设备元数据,如果元数据尚未获取到,则显示一个加载指示器。

请注意,由于设备元数据可能因设备和操作系统而异,因此获取到的字段可能会有所不同。此外,务必检查metadata_fetch的文档以获取最新的API信息和可能的字段变化。

回到顶部