Flutter通用输入输出插件universal_io2的使用
Flutter通用输入输出插件universal_io2的使用
概览
universal_io2
是一个跨平台的 dart:io
库,适用于所有平台,包括浏览器。
你可以简单地将 dart:io
的导入替换为 package:universal_io2/io.dart
。
该库受 Apache License 2.0 许可。部分源码来自 Dart SDK,并通过 Dart SDK 的 BSD 风格许可证获得。详情见 LICENSE 文件。
增加的API
1. newUniversalHttpClient
// 返回 BrowserHttpClient 在浏览器上,其他平台返回正常的 "dart:io" HttpClient。
HttpClient httpClient = newUniversalHttpClient(); // 推荐的创建 HttpClient 的方法。
2. BrowserHttpClient
// 在浏览器上工作的 "dart:io" HttpClient 的子类。
3. BrowserHttpClientRequest
// 在浏览器上工作的 "dart:io" HttpClientRequest 的子类。
4. BrowserHttpClientResponse
// 在浏览器上工作的 "dart:io" HttpClientResponse 的子类。
5. BrowserHttpClientException
// 一种异常,帮助你理解为什么浏览器上的 HTTP 请求可能失败(参见下文解释)。
其他功能
以下功能可能会在未来的版本(3.x)中被弃用:
1. HttpClient
// HttpClient() 工厂方法已更改,使其在浏览器上返回 BrowserHttpClient。
2. Platform
// 该包使得像 Platform.isAndroid 和 Platform.isMacOS 这样的方法也能在浏览器上工作。
3. InternetAddress
// 该包使得 InternetAddress 也能在浏览器上工作。
4. BytesBuilder
// 该包使得 BytesBuilder 也能在浏览器上工作。
使用步骤
1. 添加依赖
在 pubspec.yaml
文件中添加:
dependencies:
universal_io2: ^2.2.1
2. 使用 HTTP 客户端
import 'package:universal_io2/io.dart';
Future<void> main() async {
// HttpClient 可以在浏览器上使用!
HttpClient httpClient = newUniversalHttpClient(); // 推荐的创建 HttpClient 的方法。
final request = await httpClient.getUrl(Uri.parse("https://dart.dev/"));
final response = await request.close();
print(response);
}
HTTP 客户端行为
HTTP 客户端使用浏览器的 XMLHttpRequest (XHR)
API 实现。
XHR
导致与 dart:io
有以下不同点:
- HTTP 连接仅在调用
request.close()
后才创建。 - 同源策略限制。对于跨域请求,请参阅下文文档。
有用的错误信息
当请求失败且断言启用时,错误消息包含如何修复可能问题的描述,例如缺少跨域头。
错误消息类似于以下内容:
XMLHttpRequest error.
-------------------------------------------------------------------------------
HTTP 方法: PUT
HTTP URL: http://destination.com/example
来源: http://source.com
跨域: true
浏览器凭据模式: false
浏览器响应类型: arraybuffer
未知的 XHR 错误原因。
(出于安全原因,浏览器不会解释 XHR 错误。)
服务器是否宕机?服务器是否有内部错误?
启用凭据模式将允许在请求和响应中使用某些 HTTP 头。例如,凭据模式是发送/接收 cookie 所必需的。如果你认为需要启用 '凭据模式',可以执行以下操作:
final httpClientRequest = ...;
if (httpClientRequest is BrowserHttpClientRequest) {
httpClientRequest.browserCredentialsMode = true;
}
服务器是否响应了跨域 "预检" (OPTIONS) 请求?
服务器是否发送了以下头?
* Access-Control-Allow-Origin: http://source.com
* 也可以使用通配符 ("*")。
* 对于跨域请求总是需要!
* Access-Control-Allow-Methods: PUT
* 也可以使用通配符 ("*")。
有时当你在浏览器上进行跨域请求时,你可能想使用 CORS "凭据模式"
。这可以通过以下模式实现:
Future<void> main() async {
final client = HttpClient();
final request = client.getUrl(Uri.parse('http://example/url'));
// 启用凭据模式
if (request is BrowserHttpClientRequest) {
request.browserCredentialsMode = true;
}
// 关闭请求
final response = await request.close();
// ...
}
流式文本响应
底层的 XMLHttpRequest (XHR)
API 仅在 responseType
为 "text"
时支持响应流。
此包会根据 HTTP 请求头 "Accept"
的值自动使用 "text"
类型。这些媒体类型定义在:
BrowserHttpClient.defaultTextMimes
如果你想要禁用流式处理,可以使用以下模式:
Future<void> main() async {
final client = newUniversalHttpClient();
if (client is BrowserHttpClient) {
client.textMimes = const {};
}
// ...
}
示例代码
import 'package:universal_io2/io.dart';
void main() async {
// 使用 'dart:io' HttpClient API。
final httpClient = HttpClient();
final request = await httpClient.getUrl(Uri.parse('https://dart.dev'));
final response = await request.close();
print(response);
}
更多关于Flutter通用输入输出插件universal_io2的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter通用输入输出插件universal_io2的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
universal_io
是一个 Flutter 插件,旨在提供跨平台的输入输出(I/O)操作,支持 Dart、Flutter、Web 和其他平台。它提供了一个统一的 API,使得开发者可以在不同的平台上使用相同的代码进行文件操作、网络请求等 I/O 操作。
安装
首先,你需要在 pubspec.yaml
文件中添加 universal_io
依赖:
dependencies:
universal_io: ^2.0.1
然后,运行 flutter pub get
来安装依赖。
使用示例
1. 文件操作
universal_io
提供了一个类似于 dart:io
的 API 来进行文件操作。以下是一个简单的文件读写示例:
import 'package:universal_io/io.dart';
void main() async {
// 创建一个文件对象
final file = File('example.txt');
// 写入文件
await file.writeAsString('Hello, universal_io!');
// 读取文件
final contents = await file.readAsString();
print(contents); // 输出: Hello, universal_io!
}
2. 网络请求
universal_io
也提供了网络请求的功能,类似于 dart:io
中的 HttpClient
:
import 'package:universal_io/io.dart';
void main() async {
// 创建一个 HttpClient 对象
final httpClient = HttpClient();
// 发起 GET 请求
final request = await httpClient.getUrl(Uri.parse('https://jsonplaceholder.typicode.com/posts/1'));
final response = await request.close();
// 读取响应内容
final responseBody = await response.transform(utf8.decoder).join();
print(responseBody); // 输出: JSON 数据
}
3. 平台检测
universal_io
还提供了一些平台检测的功能,方便你根据不同的平台执行不同的代码:
import 'package:universal_io/io.dart';
void main() {
if (Platform.isAndroid) {
print('Running on Android');
} else if (Platform.isIOS) {
print('Running on iOS');
} else if (Platform.isWeb) {
print('Running on Web');
} else {
print('Running on another platform');
}
}