Flutter逻辑隔离插件isolated_logic的使用
Flutter逻辑隔离插件isolated_logic的使用
安装
稳定版:
dart pub add isolated_logic
特性
- 简便: 只需将现有的控制器包装起来即可使用。
- 解决方案无关: 支持任何可以发出状态的流式管理解决方案。
- 互操作性: 支持
StreamBuilders
和ValueListenableBuilder
。 - 低开销: 由于在隔离进程间进行序列化和反序列化,速度损失仅约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'),
),
],
),
),
);
}
}