Flutter逻辑隔离插件isolated_logic的使用

Flutter逻辑隔离插件isolated_logic的使用

安装

稳定版:

dart pub add isolated_logic

特性

  • 简便: 只需将现有的控制器包装起来即可使用。
  • 解决方案无关: 支持任何可以发出状态的流式管理解决方案。
  • 互操作性: 支持 StreamBuildersValueListenableBuilder
  • 低开销: 由于在隔离进程间进行序列化和反序列化,速度损失仅约5%。
  • 单一抽象: 使用单一的 IsolatedController 抽象来处理多种业务逻辑方法。

使用

示例(BLoC 的包装器)

class PrimesBlocIsolated extends IsolatedController<PrimesBLoC, AppDependencies, PrimesEvent, int> {
  /// 创建目标控制器可以作为参数声明,也可以像 'super' 值一样传递;
  PrimesBlocIsolated({required super.createController});

  /// [controllerLifecycle] 描述了在分离的隔离进程中实例化的控制器的生命周期
  [@override](/user/override)
  ControllerLifecycleHandler<PrimesBLoC> get controllerLifecycle => ControllerLifecycleHandler(
        stateStream: (controller) => controller.stream,
        dispose: (controller) => controller.close(),
      );

  /// 这些事件将在分离的隔离进程中处理
  ///
  /// 通过总线,这些事件发出的所有状态都将路由到主隔离进程
  void increment() => isolateHandle((controller) => controller.add(const PrimesEvent.increment()));
  void decrement() => isolateHandle((controller) => controller.add(const PrimesEvent.decrement()));
}

示例代码

import 'dart:async';

import 'package:example/app_dependencies.dart';
import 'package:example/counter_bloc.dart';
import 'package:flutter/material.dart';
import 'package:http/http.dart';
import 'package:isolated_logic/isolated_logic.dart';

void main() async {
  await logicalHandler.init(
    observer: IsolatedControllerObserver.dartLog(),
    dependencies: AppDependencies(
      dependency: TransitiveDependency(httpClient: Client()),
    ),
  );

  runApp(
    const MyApp(),
  );
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
        useMaterial3: true,
      ),
      home: const MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({super.key, required this.title});

  final String title;

  [@override](/user/override)
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  late final PrimesBLoC _counterMain = PrimesBLoC(TransitiveDependency(httpClient: Client()))
    ..stream.listen(_streamController.add);
  
  late final JsonBlocIsolated _counterIsolated =
      JsonBlocIsolated(createController: (deps) => PrimesBLoC(deps.dependency))..stream.listen(_streamController.add);

  final _streamController = StreamController.broadcast();
  late final stream = _streamController.stream;

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        backgroundColor: Theme.of(context).colorScheme.inversePrimary,
        title: Text(widget.title),
      ),
      body: StreamBuilder(
          stream: stream,
          builder: (context, data) => ListView.builder(
                itemBuilder: (context, index) => ListTile(
                  title: Text('${data.data}'),
                ),
              )),
      floatingActionButton: GestureDetector(
          onTap: () => _counterMain.add(const JsonEvent.increment()),
          onLongPress: _counterIsolated.increment,
          child: const DecoratedBox(
            decoration: BoxDecoration(color: Colors.greenAccent),
            child: Padding(padding: EdgeInsets.all(24), child: Icon(Icons.plus_one)),
          )),
    );
  }
}

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

1 回复

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


isolated_logic 是一个用于在 Flutter 中实现逻辑隔离的插件,它允许你将耗时的计算任务放到独立的 Isolate 中执行,从而避免阻塞 UI 线程。这对于处理复杂计算、IO 操作或其他耗时任务非常有用。

安装 isolated_logic 插件

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

dependencies:
  flutter:
    sdk: flutter
  isolated_logic: ^0.1.0 # 请使用最新版本

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

使用 isolated_logic

以下是一个简单的示例,展示了如何在 Flutter 中使用 isolated_logic 来执行耗时任务。

1. 创建 Isolate 逻辑

首先,你需要定义一个将在 Isolate 中执行的逻辑。你可以通过创建一个类并实现 IsolateLogic 接口来实现这一点。

import 'package:isolated_logic/isolated_logic.dart';

class MyIsolateLogic extends IsolateLogic {
  [@override](/user/override)
  Future<void> initialize() async {
    // 在这里进行初始化操作
  }

  [@override](/user/override)
  Future<void> dispose() async {
    // 在这里进行清理操作
  }

  Future<int> performHeavyCalculation(int input) async {
    // 模拟一个耗时计算
    await Future.delayed(Duration(seconds: 2));
    return input * 2;
  }
}

2. 使用 IsolatedLogicManager 来管理 Isolate

接下来,你可以使用 IsolatedLogicManager 来管理 Isolate 的生命周期,并与之交互。

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

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

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: IsolatedLogicExample(),
    );
  }
}

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

class _IsolatedLogicExampleState extends State<IsolatedLogicExample> {
  final IsolatedLogicManager<MyIsolateLogic> _isolatedLogicManager =
      IsolatedLogicManager<MyIsolateLogic>();

  int? _result;

  [@override](/user/override)
  void initState() {
    super.initState();
    _isolatedLogicManager.initialize();
  }

  [@override](/user/override)
  void dispose() {
    _isolatedLogicManager.dispose();
    super.dispose();
  }

  Future<void> _runHeavyCalculation() async {
    final result = await _isolatedLogicManager.execute((logic) async {
      return await logic.performHeavyCalculation(42);
    });

    setState(() {
      _result = result;
    });
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Isolated Logic Example'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            if (_result != null) Text('Result: $_result'),
            ElevatedButton(
              onPressed: _runHeavyCalculation,
              child: Text('Run Heavy Calculation'),
            ),
          ],
        ),
      ),
    );
  }
}
回到顶部