Flutter Isolate可传递的数据类型:TransferableTypedData和Capability

570 阅读3分钟

在上一篇文章从flutter_downloader的进度回调不响应来理解IsolateNameServer我提到了Isolate在通信可以传递的几种类型中有:TransferableTypedDataCapability。这篇文章就是对这两种类型做一个简单的介绍。

TransferableTypedData

TransferableTypedData 主要用于性能优化,它允许在不同隔离体之间传递二进制数据,而无需复制整个数据块。这对于大量数据的传递是非常有用的,因为它避免了不必要的内存复制,提高了性能。

下面是一些关键概念和用法:

  1. 数据所有权转移: TransferableTypedData 允许数据的所有权从一个隔离体转移到另一个。这意味着在传递数据时,不是复制数据,而是将数据所有权从一个隔离体移交给另一个。

  2. 二进制数据传递: 它通常用于传递二进制数据,比如图像、大型文件等。通过传递数据的引用而不是复制数据,可以减少不必要的内存开销。

  3. TypedData类型: TransferableTypedData 是基于 TypedData 类型的,这包括像 ByteDataFloat64List 这样的类型。

  4. 用法示例: 以下是一个简单的示例,演示如何在两个隔离体之间传递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的一些关键概念:

  1. 隔离体间通信: 在Flutter中,不同的隔离体之间是相对独立的。但是有时候,我们希望某个隔离体执行的代码能够影响到其他隔离体。这时,就需要一种机制来确保只有授权的隔离体才能执行特定的操作。

  2. Capability对象: Capability是一个对象,用于标识一个具有特定权限的实体。它是一个令牌,只有持有这个令牌的代码才能执行与该Capability相关联的操作。

  3. 创建和传递: Capability对象通常由某个具有控制权限的隔离体创建,并通过安全的方式传递给其他隔离体。这样,只有获得Capability的隔离体才能执行相关的操作。

  4. SendPort: SendPortCapability的一种:

  5. 用法示例: 下面是一个简单的示例,演示了如何在两个隔离体之间传递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的新版本中有所变化,因此建议查阅最新的文档以获取准确的信息。