在上一篇文章从flutter_downloader的进度回调不响应来理解IsolateNameServer我提到了Isolate在通信可以传递的几种类型中有:TransferableTypedData和Capability。这篇文章就是对这两种类型做一个简单的介绍。
TransferableTypedData
TransferableTypedData 主要用于性能优化,它允许在不同隔离体之间传递二进制数据,而无需复制整个数据块。这对于大量数据的传递是非常有用的,因为它避免了不必要的内存复制,提高了性能。
下面是一些关键概念和用法:
-
数据所有权转移:
TransferableTypedData允许数据的所有权从一个隔离体转移到另一个。这意味着在传递数据时,不是复制数据,而是将数据所有权从一个隔离体移交给另一个。 -
二进制数据传递: 它通常用于传递二进制数据,比如图像、大型文件等。通过传递数据的引用而不是复制数据,可以减少不必要的内存开销。
-
TypedData类型:
TransferableTypedData是基于TypedData类型的,这包括像ByteData或Float64List这样的类型。 -
用法示例: 以下是一个简单的示例,演示如何在两个隔离体之间传递
TransferableTypedData:
// 在第一个隔离体
import 'dart:isolate';
import 'dart:typed_data';
void isolate1(SendPort sendPort) {
// 创建一个包含数据的Uint8List
Uint8List data = Uint8List.fromList([1, 2, 3, 4, 5]);
// 创建TransferableTypedData
TransferableTypedData transferableData = TransferableTypedData.fromList([data.buffer]);
// 发送TransferableTypedData到另一个隔离体
sendPort.send(transferableData);
}
// 在主隔离体
void main() async {
ReceivePort receivePort = ReceivePort();
Isolate.spawn(isolate1, receivePort.sendPort);
receivePort.listen((dynamic message) {
if (message is TransferableTypedData) {
// 从TransferableTypedData中获取Uint8List
Uint8List receivedData = Uint8List.fromList(message.materialize().asUint8List());
// 处理接收到的数据
print(receivedData); // 输出: [1, 2, 3, 4, 5]
}
});
}
需要注意的是,这个示例中的数据并不会被复制,而是在两个隔离体之间传递所有权。
Capability
在Flutter中,Capability是用于安全通信和访问控制的一种机制。Capability通常与Isolate(隔离体)之间的通信一起使用,以确保只有持有特定Capability的代码能够执行特定的操作。
以下是关于Capability的一些关键概念:
-
隔离体间通信: 在Flutter中,不同的隔离体之间是相对独立的。但是有时候,我们希望某个隔离体执行的代码能够影响到其他隔离体。这时,就需要一种机制来确保只有授权的隔离体才能执行特定的操作。
-
Capability对象:
Capability是一个对象,用于标识一个具有特定权限的实体。它是一个令牌,只有持有这个令牌的代码才能执行与该Capability相关联的操作。 -
创建和传递:
Capability对象通常由某个具有控制权限的隔离体创建,并通过安全的方式传递给其他隔离体。这样,只有获得Capability的隔离体才能执行相关的操作。 -
SendPort:
SendPort是Capability的一种: -
用法示例: 下面是一个简单的示例,演示了如何在两个隔离体之间传递
Capability:
// 隔离体1
import 'dart:isolate';
void isolate1(SendPort sendPort) {
// 创建一个Capability
Capability myCapability = Capability();
// 发送Capability到另一个隔离体
sendPort.send(myCapability);
}
// 主隔离体
void main() async {
ReceivePort receivePort = ReceivePort();
Isolate.spawn(isolate1, receivePort.sendPort);
receivePort.listen((dynamic message) {
if (message is Capability) {
// 接收到Capability
Capability receivedCapability = message;
// 在这里使用Capability执行受保护的操作
if (receivedCapability.isValid) {
print("Capability有效,执行受保护的操作");
} else {
print("Capability无效,无法执行受保护的操作");
}
}
});
}
在这个例子中,Capability对象被创建并发送到另一个隔离体。接收的隔离体可以检查Capability的有效性,并根据需要执行受保护的操作。
Capability是Flutter中用于确保安全通信和访问控制的一个重要工具。请注意,关于Capability的用法可能会在Flutter和Dart的新版本中有所变化,因此建议查阅最新的文档以获取准确的信息。