Flutter URI处理插件uri_content的使用

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

Flutter URI处理插件uri_content的使用

uri_content 插件使您能够获取URI的内容,而无需在过程中生成任何临时文件。它支持以下方案:filedatahttp/httpscontent(仅限Android)。以下是关于如何使用此插件的详细指南。

开始使用

导入包

要开始使用 uri_content,首先需要导入这个包:

import 'package:uri_content/uri_content.dart';

使用方式

有两种使用方式:一种是通过扩展方法直接从URI获取内容,就像它是原生方法一样;另一种是通过 UriContent 实例来获取内容。推荐使用 UriContent 实例,因为它提供了额外的选项,例如自定义HTTP头和调整默认缓冲区大小,并且便于代码测试,因为你可以模拟它的实例。

final uriContent = UriContent();

示例代码

获取README文件长度

下面是一个简单的例子,展示了如何获取一个远程README.md文件的内容长度:

Future<void> getReadmeLength() async {
  try {
    final content = await uriContent.from(Uri.parse(
      "https://raw.githubusercontent.com/talesbarreto/pull_request_coverage/main/README.md",
    ));
    print("Content length is ${content.length}");
  } catch (e, s) {
    print("An error happened $e\n$s");
  }
}

使用getContentStream()

当不需要一次性获取全部内容时,比如在一个请求提供者中或直接将字节保存到文件中,可以使用 getContentStream() 方法。这种方法通过处理小块数据显著减少了内存消耗。

Stream<Uint8List> contentStream = uriContent.getContentStream(uri);

使用from()

from() 方法会一次性获取全部内容。请注意,尝试获取大文件可能会导致应用程序崩溃。

Future<Uint8List> content = uriContent.from(uri);

使用fromOrNull()

from() 类似,但在发生错误时返回 null 而不是抛出异常。

Future<Uint8List?> content = uriContent.fromOrNull(uri);

使用canFetchContent()

此方法检查是否可以从指定的URI获取内容。如果是文件,则检查其是否存在;如果是 http/https URI,则检查其是否可达。

Future<bool> canFetch = uriContent.canFetchContent(uri);

使用getContentLength()

返回指定URI的内容长度(以字节为单位)。依赖元数据获取内容长度,因此可能不准确。如果内容不可达,可能会抛出异常。如果无法获得内容长度,则返回 null

Future<int?> contentLength = uriContent.getContentLength(uri);

使用getContentLengthOrNull()

getContentLength() 类似,但在发生错误时返回 null。注意,null 是模糊的,可能表示内容不可达或内容长度不可用。因此,建议使用 getContentLength() 并处理其异常。

Future<int?> contentLength = uriContent.getContentLengthOrNull(uri);

使用getContent()扩展

对于 Uri 的便捷扩展方法,可以直接获取URI内容。

Future<void> getReadmeContent() async {
  try {
    final uri = Uri.parse(
      "https://raw.githubusercontent.com/talesbarreto/pull_request_coverage/main/README.md",
    );
    print(await (uri.getContent().then(utf8.decode)));
  } catch (e, s) {
    print("An error happened $e\n$s");
  }
}

此外,还有 getContentOrNull() 方法,在发生错误时返回 null

完整示例Demo

下面是一个完整的Flutter应用程序示例,演示了如何使用 uri_content 插件来加载并显示远程Markdown文档的内容:

import 'dart:convert';

import 'package:flutter/material.dart';
import 'package:flutter_markdown/flutter_markdown.dart';
import 'package:uri_content/uri_content.dart';

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

class MyApp extends StatefulWidget {
  const MyApp({super.key});

  @override
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  final uriStringFuture = Uri.parse(
    "https://raw.githubusercontent.com/talesbarreto/pull_request_coverage/main/README.md",
  ).getContent().then(utf8.decode);

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text("pull_request_coverage readme"),
        ),
        body: FutureBuilder<String>(
          future: uriStringFuture,
          builder: (BuildContext context, AsyncSnapshot<String> snapshot) {
            return Markdown(
              data: snapshot.data ?? snapshot.connectionState.name,
              imageBuilder: (_, __, ___) => const SizedBox(),
            );
          },
        ),
      ),
    );
  }
}

在这个示例中,我们创建了一个简单的Flutter应用程序,它从给定的URL加载Markdown格式的README文件,并将其显示在屏幕上。希望这能帮助你更好地理解如何在Flutter项目中使用 uri_content 插件。


更多关于Flutter URI处理插件uri_content的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter URI处理插件uri_content的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在处理Flutter应用中的URI时,uri_content插件是一个非常有用的工具。这个插件允许你解析和处理从其他应用或网页传递过来的URI内容。下面是一个如何使用uri_content插件的示例代码案例。

首先,确保你已经在pubspec.yaml文件中添加了uri_content插件的依赖:

dependencies:
  flutter:
    sdk: flutter
  uri_content: ^最新版本号  # 请替换为实际最新版本号

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

接下来,我们编写一个示例应用,展示如何使用uri_content插件来处理URI。

示例代码

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'URI Content Handling Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  String _uriContent = '';

  @override
  void initState() {
    super.initState();
    // 监听URI变化
    UriContent.listen((Uri? uri) {
      if (uri != null) {
        setState(() {
          _uriContent = uri.toString();
        });
        // 在这里处理URI内容,例如解析参数等
        print('Received URI: $_uriContent');
      }
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('URI Content Handling Demo'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              'Received URI:',
              style: TextStyle(fontSize: 20),
            ),
            SizedBox(height: 10),
            Text(
              _uriContent,
              style: TextStyle(fontSize: 20),
              maxLines: 5,
              overflow: TextOverflow.ellipsis,
            ),
          ],
        ),
      ),
    );
  }
}

解释

  1. 依赖添加:在pubspec.yaml文件中添加uri_content依赖。
  2. 监听URI变化:在initState方法中,使用UriContent.listen方法来监听URI的变化。每当应用接收到一个新的URI时,这个方法就会被调用,并传递一个新的Uri对象。
  3. 更新UI:当接收到新的URI时,使用setState方法来更新UI,显示接收到的URI内容。
  4. 处理URI:在UriContent.listen的回调中,你可以添加更多的逻辑来处理URI内容,例如解析URI参数、执行某些操作等。

这个示例展示了如何使用uri_content插件来监听和处理URI变化,并在Flutter应用中显示接收到的URI内容。你可以根据自己的需求进一步扩展这个示例,例如处理不同类型的URI、执行特定的操作等。

回到顶部