Flutter队列管理插件queuekit的使用
Flutter队列管理插件queuekit的使用
Queuekit 是一个用于 Dart 和 Flutter 应用程序的任务队列库。它支持跨应用重启任务的持久化。
示例代码
以下是使用 queuekit
的完整示例代码:
import 'dart:async';
import 'package:flutter/material.dart';
import 'package:queuekit/queuekit.dart';
import 'package:shared_preferences/shared_preferences.dart';
// 创建一个队列开始监听器
final startListenable = QueueStartListenable();
// 定义一个持久化的队列
late final HydratedQueue queue;
// 自定义事件序列化器
final exampleEventSerializer = JsonSerializer(
fromJson: (json) {
return ExampleEvent()
..retryConfig = linearRetryConfigSerializer.fromJson(
json['retryConfig'] as Map<String, dynamic>,
);
},
toJson: (event) {
return {
'retryConfig': linearRetryConfigSerializer.toJson(event.retryConfig!),
};
},
);
// 定义一个示例事件类
class ExampleEvent extends Event<String> {
@override
String get id => 'id';
@override
String get type => 'ExampleEvent';
@override
LinearRetryConfig? retryConfig = LinearRetryConfig(maxRetries: 10, delay: const Duration(seconds: 1));
@override
Future<String> run() {
return Future.delayed(const Duration(seconds: 1), () => 'Hello World!');
}
}
Future<void> main() async {
WidgetsFlutterBinding.ensureInitialized();
// 初始化SharedPreferences
final prefs = await SharedPreferences.getInstance();
// 创建持久化的队列实例
queue = HydratedQueue(
startListenable,
eventSerializers: {
'ExampleEvent': (
fromJson: exampleEventSerializer.fromJson,
toJson: (event) => exampleEventSerializer.toJson(event as ExampleEvent),
),
},
saveCurrentQueue: (data) async {
await prefs.setString('currentQueue', data);
},
hydrateCurrentQueue: () {
return prefs.getString('currentQueue');
},
saveRetryQueue: (data) async {
await prefs.setString('retryQueue', data);
},
hydrateRetryQueue: () {
return prefs.getString('retryQueue');
},
);
// 恢复队列状态
await queue.hydrate();
startListenable.start();
// 启动应用
runApp(const MainApp());
}
// 主应用类
class MainApp extends StatefulWidget {
const MainApp({super.key});
@override
State<MainApp> createState() => _MainAppState();
}
// 主应用状态类
class _MainAppState extends State<MainApp> {
late final StreamSubscription subscription;
final data = <String>[];
@override
void initState() {
super.initState();
// 监听队列事件
subscription = queue.listenWhere<ExampleEvent, String>((params) {
setState(() {
data.add(params.result);
});
});
}
@override
void dispose() {
// 取消订阅
subscription.cancel();
super.dispose();
}
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
if (data.isEmpty) const Text('按按钮添加事件'),
for (final item in data) Text(item),
],
),
),
floatingActionButton: FloatingActionButton(
onPressed: () {
// 添加事件到队列
queue.add(ExampleEvent());
},
child: const Icon(Icons.add),
),
),
);
}
}
代码解释
-
导入必要的包
import 'dart:async'; import 'package:flutter/material.dart'; import 'package:queuekit/queuekit.dart'; import 'package:shared_preferences/shared_preferences.dart';
-
创建队列开始监听器
final startListenable = QueueStartListenable();
-
初始化SharedPreferences
final prefs = await SharedPreferences.getInstance();
-
创建持久化的队列实例
queue = HydratedQueue( startListenable, eventSerializers: { 'ExampleEvent': ( fromJson: exampleEventSerializer.fromJson, toJson: (event) => exampleEventSerializer.toJson(event as ExampleEvent), ), }, saveCurrentQueue: (data) async { await prefs.setString('currentQueue', data); }, hydrateCurrentQueue: () { return prefs.getString('currentQueue'); }, saveRetryQueue: (data) async { await prefs.setString('retryQueue', data); }, hydrateRetryQueue: () { return prefs.getString('retryQueue'); }, );
-
恢复队列状态
await queue.hydrate(); startListenable.start();
-
监听队列事件
subscription = queue.listenWhere<ExampleEvent, String>((params) { setState(() { data.add(params.result); }); });
-
添加事件到队列
queue.add(ExampleEvent());
-
构建UI
return MaterialApp( home: Scaffold( body: Center( child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ if (data.isEmpty) const Text('按按钮添加事件'), for (final item in data) Text(item), ], ), ), floatingActionButton: FloatingActionButton( onPressed: () { queue.add(ExampleEvent()); }, child: const Icon(Icons.add), ), ), );
更多关于Flutter队列管理插件queuekit的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html
1 回复
更多关于Flutter队列管理插件queuekit的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
queuekit
是 Flutter 中的一个插件,用于管理和处理任务队列。它允许你将任务按顺序执行,支持并发控制、优先级设置等功能。以下是关于如何使用 queuekit
的基本指南。
1. 添加依赖
首先,在你的 pubspec.yaml
文件中添加 queuekit
依赖:
dependencies:
flutter:
sdk: flutter
queuekit: ^0.0.1 # 使用最新版本
然后运行 flutter pub get
来安装依赖。
2. 创建队列
你可以创建一个任务队列,并设置最大并发数:
import 'package:queuekit/queuekit.dart';
void main() {
final queue = QueueKit(maxConcurrent: 3); // 最大并发数为 3
}
3. 添加任务
你可以向队列中添加任务。任务是一个 Future
,并且可以设置优先级。
queue.add(() async {
print('Task 1 started');
await Future.delayed(Duration(seconds: 2));
print('Task 1 completed');
}, priority: 1);
queue.add(() async {
print('Task 2 started');
await Future.delayed(Duration(seconds: 1));
print('Task 2 completed');
}, priority: 2);
queue.add(() async {
print('Task 3 started');
await Future.delayed(Duration(seconds: 1));
print('Task 3 completed');
}, priority: 3);
4. 执行任务
你可以启动队列来执行任务:
await queue.start();
5. 暂停和恢复队列
你可以暂停和恢复队列的执行:
queue.pause();
// 暂停后,队列将不再执行新任务
// 你可以稍后恢复执行
queue.resume();
6. 监听队列状态
你可以监听队列的状态,例如任务完成、队列空闲等:
queue.onTaskComplete.listen((task) {
print('Task completed: $task');
});
queue.onQueueIdle.listen((_) {
print('Queue is idle');
});
7. 取消任务
你可以取消队列中的任务:
final task = queue.add(() async {
print('Task 4 started');
await Future.delayed(Duration(seconds: 2));
print('Task 4 completed');
}, priority: 4);
// 取消任务
task.cancel();
8. 自定义任务执行器
你还可以自定义任务的执行器,例如使用不同的线程池:
final customExecutor = CustomExecutor();
final queue = QueueKit(executor: customExecutor);
9. 示例代码
以下是一个完整的示例代码:
import 'package:queuekit/queuekit.dart';
void main() async {
final queue = QueueKit(maxConcurrent: 2);
queue.add(() async {
print('Task 1 started');
await Future.delayed(Duration(seconds: 2));
print('Task 1 completed');
}, priority: 1);
queue.add(() async {
print('Task 2 started');
await Future.delayed(Duration(seconds: 1));
print('Task 2 completed');
}, priority: 2);
queue.add(() async {
print('Task 3 started');
await Future.delayed(Duration(seconds: 1));
print('Task 3 completed');
}, priority: 3);
await queue.start();
queue.onQueueIdle.listen((_) {
print('Queue is idle');
});
}