Flutter隔离执行环境插件isolated的使用

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

Flutter 隔离执行环境插件 isolated 的使用

提供了使用 Isolates 的功能。

特性

IsolateBundle

IsolateBundle 封装了一个 Isolate 以及一个发送函数和消息流。这个包可以使用 IsolateBundleFactory 来生成。该工厂负责配置 SendPortReceivePort 以及后续的清理工作。

PingPongIsolateBundle

这是一个实现了请求-响应模式的 IsolateBundle。该包可用于向 Isolate 发送消息,Isolate 会处理该消息。当 Isolate 准备好时,它会返回给调用方 Isolate,并且 pingPong 函数将返回。

使用方法

以下是使用 isolated 插件的基本步骤:

  1. 创建一个顶级或静态函数来处理计算。 注意:必须调用 config.activateOnCurrentIsolate 来正确配置 Isolate
void deserialize(IsolateBundleConfiguration config) {
  config.activateOnCurrentIsolate<PingPongMessage<String>>(
    (message) {
      config.toCaller.send(PingPongMessage<dynamic>(
        message.id,
        jsonDecode(message.value),
      ));
    },
    (cancelMessage) {},
  );
}
  1. 使用 IsolateBundleFactory 创建一个包。
final bundle = await factory
    .startNewPingPong<IsolateBundleConfiguration, String, dynamic>(
  deserialize,
  (toCaller) => IsolateBundleConfiguration(toCaller),
);
  1. Isolate 发送消息。
final deserialized = await bundle.pingPong('{"Property": "Hello world"}');
  1. 计算的结果将被返回。

完整的代码示例可以在 example 文件夹 中找到。

示例代码

import 'dart:convert';

import 'package:isolated/isolated.dart';

const factory = IsolateBundleFactory();

Future<void> main() async {
  final bundle = await factory
      .startNewPingPong<IsolateBundleConfiguration, String, dynamic>(
    deserialize,
    (toCaller) => IsolateBundleConfiguration(toCaller),
  );

  final deserialized = await bundle.pingPong('{"Property": "Hello world"}');
  // ignore: avoid_print
  print(deserialized);
  bundle.cancel();
}

void deserialize(IsolateBundleConfiguration config) {
  config.activateOnCurrentIsolate<PingPongMessage<String>>(
    (message) {
      config.toCaller.send(PingPongMessage<dynamic>(
        message.id,
        jsonDecode(message.value),
      ));
    },
    (cancelMessage) {},
  );
}

更多关于Flutter隔离执行环境插件isolated的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter隔离执行环境插件isolated的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在Flutter中,isolated 插件可以帮助你在隔离的执行环境中运行代码,这对于需要处理敏感操作、高计算量任务或需要避免阻塞主UI线程的场景特别有用。尽管 isolated 并不是 Flutter 官方插件,但我们可以利用 Dart 的 Isolate 机制来实现类似的功能。下面是一个简单的示例,展示如何在 Flutter 中使用 Dart 的 Isolate 来隔离执行代码。

首先,确保你的 Flutter 环境已经设置好,并且你有一个正在运行的 Flutter 项目。

1. 添加依赖

由于我们使用的是 Dart 的原生 Isolate 功能,所以不需要额外的插件依赖。但是,为了处理跨 Isolate 通信,我们可能需要一些帮助类,比如 SendPortReceivePort

2. 编写隔离执行代码

我们将编写一个简单的 Dart 函数,该函数将在隔离环境中执行。为了演示,我们将计算一个斐波那契数列。

import 'dart:isolate';

// 计算斐波那契数列的函数
void computeFibonacci(SendPort sendPort, int n) {
  int fibonacci(int x) {
    if (x <= 1) return x;
    return fibonacci(x - 1) + fibonacci(x - 2);
  }

  int result = fibonacci(n);
  // 将结果发送回主 Isolate
  sendPort.send(result);
}

3. 在 Flutter 应用中使用

接下来,我们在 Flutter 应用中启动一个新的 Isolate 并与之通信。

import 'package:flutter/material.dart';
import 'dart:isolate';
import 'dart:async';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Isolate Example'),
        ),
        body: Center(
          child: FibonacciIsolateExample(),
        ),
      ),
    );
  }
}

class FibonacciIsolateExample extends StatefulWidget {
  @override
  _FibonacciIsolateExampleState createState() => _FibonacciIsolateExampleState();
}

class _FibonacciIsolateExampleState extends State<FibonacciIsolateExample> {
  String _result = "Calculating...";

  void _computeFibonacci() async {
    final receivePort = ReceivePort();
    Isolate.spawn(computeFibonacci, [receivePort.sendPort, 40]); // 启动新的 Isolate 计算斐波那契数列第40项

    // 等待接收结果
    final result = await receivePort.first;
    setState(() {
      _result = "Fibonacci(40) = $result";
    });
  }

  @override
  Widget build(BuildContext context) {
    return Column(
      mainAxisAlignment: MainAxisAlignment.center,
      children: <Widget>[
        Text(_result),
        SizedBox(height: 20),
        ElevatedButton(
          onPressed: _computeFibonacci,
          child: Text('Compute Fibonacci(40)'),
        ),
      ],
    );
  }
}

4. 运行应用

现在,你可以运行你的 Flutter 应用,点击按钮后,应用将在新建的 Isolate 中计算斐波那契数列的第40项,而不会阻塞主UI线程。

总结

虽然 isolated 插件可能提供了更高级或更便捷的接口来处理隔离执行环境,但使用 Dart 原生的 Isolate 机制仍然是一个强大且灵活的选择。上面的示例展示了如何在 Flutter 中使用 Isolate 来隔离执行代码,并通过 SendPortReceivePort 实现跨 Isolate 通信。

回到顶部