Flutter隔离执行插件isolate_flutter的使用

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

Flutter隔离执行插件isolate_flutter的使用

IsolateFlutter

Pub

IsolateFlutter 是一个用于创建和管理 Isolate 的实用包。它基于 dart:isolate,因此仅支持 iOS 和 Android。

它类似于 compute()创建一个 isolate,在该 isolate 上运行回调函数,并传递消息,最终返回回调函数的值。但是它不是顶层常量,因此你可以同时创建多个 Isolate。

使用方法

创建并启动一个 Isolate

final _value = await IsolateFlutter.createAndStart(_testFunction, 'Hello World');
print(_value);

创建并管理一个 Isolate(不立即运行)

  1. 创建一个 Isolate

    IsolateFlutter _isolateFlutter = await IsolateFlutter.create(_testFunction, 'Hello World');
    
  2. 启动并获取 _testFunction 返回的值

    final _value = await _isolateFlutter.start();
    print(_value);
    
  3. 暂停正在运行的 Isolate

    _isolateFlutter.pause();
    
  4. 恢复已暂停的 Isolate

    _isolateFlutter.resume();
    
  5. 停止并释放一个 Isolate

    _isolateFlutter.stop();
    

示例测试函数

static Future<String> _testFunction(String message) async {
  Timer.periodic(Duration(seconds: 1), (timer) => print('$message - ${timer.tick}'));
  await Future.delayed(Duration(seconds: 30));
  return '_testFunction finish';
}

完整示例 Demo

下面是一个完整的示例应用,展示了如何在 Flutter 应用中使用 IsolateFlutter 包。

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'IsolateFlutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
        visualDensity: VisualDensity.adaptivePlatformDensity,
      ),
      home: MyHomePage(title: 'IsolateFlutter Demo'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  final String title;

  MyHomePage({Key? key, required this.title}) : super(key: key);

  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  IsolateFlutter? _isolateFlutter;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            TextButton.icon(
              label: Text('Create'),
              icon: Icon(Icons.create),
              onPressed: _onCreate,
            ),
            TextButton.icon(
              label: Text('Start'),
              icon: Icon(Icons.play_arrow),
              onPressed: _onStart,
            ),
            TextButton.icon(
              label: Text('Pause'),
              icon: Icon(Icons.pause),
              onPressed: _onPause,
            ),
            TextButton.icon(
              label: Text('Resume'),
              icon: Icon(Icons.play_arrow),
              onPressed: _onResume,
            ),
            TextButton.icon(
              label: Text('Stop'),
              icon: Icon(Icons.stop),
              onPressed: _onStop,
            ),
            Text('--- OR ---'),
            TextButton.icon(
              label: Text('Create and start'),
              icon: Icon(Icons.playlist_play),
              onPressed: _onCreateAndStart,
            ),
          ],
        ),
      ),
    );
  }

  void _onCreate() async {
    print('Create Isolate');
    _isolateFlutter = await IsolateFlutter.create(_testFunction, 'Hello World');
  }

  void _onStart() async {
    print('Start Isolate');
    final _value = await _isolateFlutter?.start();
    print(_value);
  }

  void _onPause() {
    print('Pause Isolate');
    _isolateFlutter?.pause();
  }

  void _onResume() {
    print('Resume Isolate');
    _isolateFlutter?.resume();
  }

  void _onStop() {
    print('Stop Isolate');
    _isolateFlutter?.stop();
  }

  void _onCreateAndStart() async {
    print('Create And Start Isolate');
    final _value = await IsolateFlutter.createAndStart(_testFunction, 'Hello World');
    print(_value);
  }

  static Future<String> _testFunction(String message) async {
    Timer.periodic(Duration(seconds: 1), (timer) => print('$message - ${timer.tick}'));
    await Future.delayed(Duration(seconds: 30));
    return '_testFunction finish';
  }
}

作者

IsolateFlutter 是由 Thong Dang 开发的。你可以通过电子邮件 thongdn.it@gmail.com 联系他。

如果你喜欢这个项目,可以通过 Buy Me A Coffee 支持他或为项目点赞。

感谢你的支持!❤️


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

1 回复

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


在Flutter中,isolate_flutter插件可以用于在隔离环境中执行代码,以避免阻塞主线程,这在执行耗时操作时特别有用。以下是一个使用isolate_flutter插件的示例代码案例,演示了如何在隔离环境中执行一些计算操作。

首先,你需要在你的pubspec.yaml文件中添加isolate_flutter依赖:

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

然后,运行flutter pub get来安装依赖。

接下来,在你的Flutter项目中,你可以按照以下步骤使用isolate_flutter

  1. 导入必要的包
import 'package:flutter/material.dart';
import 'package:isolate_flutter/isolate_flutter.dart';
  1. 定义一个计算函数,这个函数将在隔离环境中执行
// 这是一个简单的计算函数,用于演示
int computeFibonacci(int n) {
  if (n <= 1) return n;
  return computeFibonacci(n - 1) + computeFibonacci(n - 2);
}
  1. 在隔离环境中执行计算函数
void main() {
  runApp(MyApp());
}

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

class MyIsolateWidget extends StatefulWidget {
  @override
  _MyIsolateWidgetState createState() => _MyIsolateWidgetState();
}

class _MyIsolateWidgetState extends State<MyIsolateWidget> {
  String result = 'Calculating...';

  @override
  Widget build(BuildContext context) {
    return Column(
      mainAxisAlignment: MainAxisAlignment.center,
      children: <Widget>[
        Text('Fibonacci of 20:'),
        Text(result),
        ElevatedButton(
          onPressed: () async {
            setState(() {
              result = 'Calculating...';
            });

            // 在隔离环境中执行计算
            final resultIsolate = await computeIsolate(computeFibonacci, 20);

            // 更新UI
            setState(() {
              result = 'Fibonacci of 20 is ${resultIsolate}';
            });
          },
          child: Text('Compute Fibonacci'),
        ),
      ],
    );
  }
}

在上面的代码中,我们定义了一个MyIsolateWidget,它包含一个按钮和一个显示结果的文本。当用户点击按钮时,我们会在隔离环境中执行computeFibonacci函数来计算斐波那契数列的第20项,并更新UI以显示结果。

注意,computeIsolate函数是isolate_flutter插件提供的,用于在隔离环境中执行传入的函数。这个函数是异步的,因此我们使用await来等待结果,并在结果返回后更新UI。

请确保你已经按照插件的文档正确配置了项目,并替换了^x.y.z为实际的最新版本号。由于插件的API可能会随着版本更新而变化,因此建议查阅最新的插件文档以获取最新和最准确的信息。

回到顶部