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),
        ),
      ),
    );
  }
}

代码解释

  1. 导入必要的包

    import 'dart:async';
    import 'package:flutter/material.dart';
    import 'package:queuekit/queuekit.dart';
    import 'package:shared_preferences/shared_preferences.dart';
    
  2. 创建队列开始监听器

    final startListenable = QueueStartListenable();
    
  3. 初始化SharedPreferences

    final prefs = await SharedPreferences.getInstance();
    
  4. 创建持久化的队列实例

    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');
      },
    );
    
  5. 恢复队列状态

    await queue.hydrate();
    startListenable.start();
    
  6. 监听队列事件

    subscription = queue.listenWhere<ExampleEvent, String>((params) {
      setState(() {
        data.add(params.result);
      });
    });
    
  7. 添加事件到队列

    queue.add(ExampleEvent());
    
  8. 构建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');
  });
}
回到顶部