Flutter UI隔离渲染插件dart_ui_isolate的使用

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

Flutter UI隔离渲染插件 dart_ui_isolate 的使用

dart_ui_isolate 插件允许在独立的 isolate 中运行 dart:ui,从而实现 UI 渲染的隔离。本文将详细介绍该插件的使用方法,并提供一个完整的示例 demo。

特性与限制

FlutterEngineGroup 支持

  • flutter_isolate 不同,dart_ui_isolate 支持 FlutterEngineGroup
  • 使用 FlutterEngineGroup 可以显著减少 RAM 使用(约99%),并且在 iOS 和 Android 上支持即时启动 isolate。
  • 注意:macOS 不支持 FlutterEngineGroup

平台插件不支持

  • dart_ui_isolate 不支持在 spawn 的 isolate 中调用平台插件。
  • 如果需要同时使用 dart:ui 和平台插件,请使用 flutter_isolate

DartUiIsolate API

方法 Android iOS 描述
DartUiIsolate.spawn() 启动一个新的 DartUiIsolate
isolate.pause() 暂停 isolate
isolate.resume() 恢复 isolate
isolate.kill() 终止 isolate
flutterCompute() 在计算回调中运行代码

使用示例

示例代码

以下是一个完整的示例 demo,展示如何使用 dart_ui_isolate 进行 UI 渲染:

import 'dart:async';
import 'dart:ui' as ui;

import 'package:flutter/material.dart';
import 'package:dart_ui_isolate/dart_ui_isolate.dart';

// macOS 需要的入口点
[@pragma](/user/pragma)('vm:entry-point')
void _flutterIsolateEntryPoint() => DartUiIsolate.macosIsolateInitialize();

// Isolate 入口函数
[@pragma](/user/pragma)('vm:entry-point')
void isolateEntryPoint(String arg) async {
  print('isolate: setup canvas');
  final recorder = ui.PictureRecorder();
  final canvas = ui.Canvas(recorder);
  final paint = ui.Paint();
  paint.style = ui.PaintingStyle.fill;

  // 绘制圆形
  print('isolate: drawing circle');
  final size = ui.Size(300, 300);
  final center = ui.Offset(size.width / 2, size.height / 2);
  final radius = size.width / 4;
  canvas.drawCircle(center, radius, paint);

  // 结束录制
  print('isolate: ending recording');
  recorder.endRecording();
}

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

class MyApp extends StatefulWidget {
  [@override](/user/override)
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
        home: Scaffold(
            appBar: AppBar(
              title: const Text('Dart UI Isolate'),
            ),
            body: AppWidget()));
  }
}

class AppWidget extends StatelessWidget {
  static void downloaderCallback(String id, int status, int progress) {
    print("progress: $progress");
  }

  Future<void> _runTest() async {
    final isolate = await DartUiIsolate.spawn(isolateEntryPoint, "painter");
    Timer(Duration(seconds: 5), () {
      print("Pausing Isolate 1");
      isolate.pause();
    });
    Timer(Duration(seconds: 10), () {
      print("Resuming Isolate 1");
      isolate.resume();
    });
    Timer(Duration(seconds: 20), () {
      print("Killing Isolate 1");
      isolate.kill();
    });
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Center(
      child: Column(crossAxisAlignment: CrossAxisAlignment.center, children: [
        Padding(
          padding: const EdgeInsets.only(top: 30),
          child: ElevatedButton(
            child: Text('Test Dart UI Isolate'),
            onPressed: _runTest,
          ),
        ),
      ]),
    );
  }
}

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

1 回复

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


当然,dart_ui_isolate 是一个用于在 Flutter 中实现 UI 隔离渲染的插件,它可以帮助开发者在不同的 Dart 隔离环境中渲染 UI,从而避免某些性能瓶颈或安全问题。下面是一个基本的代码案例,展示了如何使用 dart_ui_isolate 插件来实现 UI 的隔离渲染。

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

dependencies:
  flutter:
    sdk: flutter
  dart_ui_isolate: ^最新版本号  # 请替换为实际可用的最新版本号

然后,你可以按照以下步骤在你的 Flutter 项目中使用它:

  1. 初始化 DartUIIsolate:

    在你的主应用代码(如 main.dart)中,初始化 DartUIIsolate

import 'package:flutter/material.dart';
import 'package:dart_ui_isolate/dart_ui_isolate.dart';

void main() {
  runApp(MyApp());
  // 初始化 DartUIIsolate
  DartUIIsolate.init();
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Flutter UI Isolation Example'),
        ),
        body: Center(
          child: UIIsolateExample(),
        ),
      ),
    );
  }
}
  1. 创建并显示隔离的 UI:

    创建一个新的 Dart 隔离环境,并在其中渲染 UI。

import 'package:flutter/material.dart';
import 'package:dart_ui_isolate/dart_ui_isolate.dart';

class UIIsolateExample extends StatefulWidget {
  @override
  _UIIsolateExampleState createState() => _UIIsolateExampleState();
}

class _UIIsolateExampleState extends State<UIIsolateExample> {
  DartUIIsolate? _uiIsolate;

  @override
  void initState() {
    super.initState();
    // 创建 DartUIIsolate 实例
    _uiIsolate = DartUIIsolate.create();

    // 在 DartUIIsolate 中渲染 UI
    _uiIsolate?.run((isolateContext) {
      return MaterialApp(
        home: Scaffold(
          appBar: AppBar(
            title: Text('Isolated UI'),
          ),
          body: Center(
            child: Text('This UI is rendered in a separate Dart isolate!'),
          ),
        ),
      );
    });
  }

  @override
  Widget build(BuildContext context) {
    // 显示 DartUIIsolate 渲染的 UI,如果已创建
    return _uiIsolate?.widget ?? Container(
      child: Center(
        child: CircularProgressIndicator(),
      ),
    );
  }

  @override
  void dispose() {
    // 销毁 DartUIIsolate 实例以释放资源
    _uiIsolate?.dispose();
    _uiIsolate = null;
    super.dispose();
  }
}

在这个示例中,我们创建了一个 DartUIIsolate 实例,并在其中运行了一个简单的 Flutter 应用。请注意,_uiIsolate?.widget 用于获取并显示隔离环境中渲染的 UI。CircularProgressIndicator 作为一个占位符,在隔离环境初始化完成之前显示。

请注意,dart_ui_isolate 插件的具体 API 和用法可能会随着版本的更新而有所变化,因此请参考插件的官方文档和示例代码以获得最新和最准确的信息。

此外,由于 Flutter 和 Dart 的架构限制,UI 隔离渲染的实现可能会比较复杂,并且可能涉及到一些底层细节。在实际应用中,你需要根据具体的需求和场景来评估是否需要使用 UI 隔离渲染,并仔细测试以确保性能和稳定性。

回到顶部