Flutter类型安全隔离插件typed_isolate的使用

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

Flutter类型安全隔离插件typed_isolate的使用

typed_isolate 是一个用于简化和实现类型安全的Dart isolate使用的插件。它支持父和子isolate之间的双向通信,并提供了完整的类型安全性。

Features 特性

  • 声明一个处理传入数据并可以向子isolate发送消息的父isolate。
  • 声明一个或多个从主isolate接收请求并向其发送数据的子isolate。
  • 轻松从父isolate中生成子isolate。
  • 天然支持长时间运行的isolate。
  • 由于在各处都使用了类型参数,因此实现了完全的类型安全性!

Usage 使用方法

开始时,创建一个 IsolateParent 并调用 init() 方法。调用 spawn() 创建子isolate后,可以使用 sendToChild 和订阅其 stream

void main() async {
  // 发送整数,接收字符串
  final parent = IsolateParent<int, String>();
  parent.init();
  parent.stream.listen(print);
  await parent.spawn(MyChildIsolate(id: "my-child-id"));
  parent.sendToChild(id: "my-child-id", data: 1);
}

要创建一个子isolate,需继承 IsolateChild 并提供一个 id 和一个用于处理来自父isolate的消息的 onData 处理器。使用 sendToParent 向父isolate发送数据。如果需要在子isolate启动时运行代码,可以重写 onSpawn 方法。

以下是一个示例子isolate,它接收整数并将它们包裹在方括号内:

// 发送字符串,接收整数
class NumberConverter extends IsolateChild<String, int> {
  NumberConverter() : super(id: "brackets");

  @override
  void onSpawn() => print("Opening child $id...");

  @override
  void onData(int data) => sendToParent("[$data]");
}

以下是集成示例:

// ignore_for_file: avoid_print

import "package:typed_isolate/typed_isolate.dart";

class NumberConverter extends IsolateChild<String, int> {
  NumberConverter() : super(id: "brackets");

  @override
  Future<void> onSpawn() async {}

  @override
  void onData(int data) => sendToParent("[$data]");
}

class NumberConverter2 extends IsolateChild<String, int> {
  NumberConverter2() : super(id: "braces");

  @override
  Future<void> onSpawn() async {
    // [onData] 将不会被调用直到这个完成
    sendToParent("Opening child $id in 3 seconds...");
    await Future<void>.delayed(const Duration(seconds: 3));
  }

  @override
  void onData(int data) => sendToParent("{$data}");
}

void onData(String str) => print("Got: $str");

void main() async {
  print("Opening parent...");
  final parent = IsolateParent<int, String>();
  parent.init();
  parent.stream.listen(onData);
  await parent.spawn(NumberConverter());
  await parent.spawn(NumberConverter2());

  for (var i = 1; i < 4; i++) {
    parent.sendToChild(data: i, id: "braces");
    parent.sendToChild(data: i, id: "brackets");
    await Future<void>.delayed(const Duration(seconds: 1));
  }

  await parent.dispose();
}

此示例展示了如何初始化父isolate,生成两个不同的子isolate,并通过它们传递数据。每个子isolate对接收到的数据进行不同形式的包装(例如方括号和大括号),然后将结果发送回父isolate。最后,父isolate打印接收到的所有数据。


更多关于Flutter类型安全隔离插件typed_isolate的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter类型安全隔离插件typed_isolate的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是一个关于如何在Flutter项目中使用typed_isolate插件来实现类型安全隔离的示例代码。typed_isolate是一个Flutter插件,它允许你在Dart的隔离(Isolate)中运行代码,同时保持类型安全。

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

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

然后运行flutter pub get来获取依赖。

接下来,我们编写一个简单的示例,展示如何使用typed_isolate在隔离中运行计算任务。

示例代码

  1. 创建一个计算任务的数据结构
import 'package:typed_isolate/typed_isolate.dart';

class ComputeTask with Struct {
  final int a;
  final int b;

  @override
  List<Object?> get props => [a, b];

  ComputeTask({required this.a, required this.b});
}

class ComputeResult with Struct {
  final int result;

  @override
  List<Object?> get props => [result];

  ComputeResult({required this.result});
}
  1. 编写在隔离中运行的任务函数
ComputeResult computeSum(ComputeTask task) {
  int sum = task.a + task.b;
  return ComputeResult(result: sum);
}
  1. 在主隔离中调用任务并获取结果
import 'package:flutter/material.dart';
import 'package:typed_isolate/typed_isolate.dart';
import 'compute_task.dart';  // 假设上面的代码保存在这个文件里

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

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  String resultText = "Calculating...";

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

  Future<void> computeSumInIsolate() async {
    final task = ComputeTask(a: 5, b: 10);
    final compute = Compute<ComputeTask, ComputeResult>(computeSum);
    final result = await compute.call(task);

    setState(() {
      resultText = "Result: ${result.result}";
    });
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Typed Isolate Example'),
        ),
        body: Center(
          child: Text(resultText),
        ),
      ),
    );
  }
}

解释

  1. 数据结构:我们定义了两个数据结构ComputeTaskComputeResult,它们都实现了Struct接口。这是typed_isolate要求的,以便在隔离间安全地传递数据。

  2. 计算函数computeSum函数接受一个ComputeTask对象并返回一个ComputeResult对象。这个函数将在隔离中运行。

  3. 主隔离调用:在MyAppinitState方法中,我们创建了一个ComputeTask对象,并使用Compute类来在隔离中调用computeSum函数。然后,我们等待结果并更新UI。

这样,你就成功地使用了typed_isolate插件在Flutter应用中实现了类型安全的隔离计算。这个示例展示了基本的用法,你可以根据需求扩展和修改。

回到顶部