Flutter队列管理插件queue_plus的使用

Flutter队列管理插件queue_plus的使用

为什么需要?

我需要一个包来处理高级的蓝牙设备发送队列处理,包括:

  • ✅ 基本队列功能(添加、删除、清除等)
  • ✅ 带有延迟和超时的队列
  • ✅ 带有优先级的队列
  • ⭕️ 具有重试策略的队列

安装

通过 dart pub add 安装:

dart pub add queue_plus

示例

以下是一个完整的示例,展示了如何使用 queue_plus 插件。

import 'dart:async';
import 'package:queue_plus/queue_plus.dart';

void main() async {
  // 创建第一个队列,默认并行处理为1
  QueuePlus<void> queue = QueuePlus(onComplete: () async => print('Queue 1 completed'));

  // 添加剩余项目数量的监听器
  var queue1itemsListener = queue.remainingItems.listen((count) {
    print('Queue 1 Remaining items: $count');
  });

  // 向队列中添加任务
  queue.add(QueueItem(task: () async => Future.delayed(Duration(seconds: 1), () => print('Queue1: 1'))));
  queue.add(QueueItem(task: () async => Future.delayed(Duration(seconds: 1), () => print('Queue1: 2'))));
  queue.add(QueueItem(task: () async => Future.delayed(Duration(seconds: 1), () => print('Queue1: 3'))));

  // 创建第二个队列,并设置并行处理数为3
  QueuePlus<void> queue2 = QueuePlus(parallel: 3, onComplete: () async => print('Queue 2 completed'));

  // 添加剩余项目数量的监听器
  var queue2itemsListener = queue2.remainingItems.listen((count) {
    print('Queue 2 Remaining items: $count');
  });

  // 向队列中添加任务
  queue2.add(QueueItem(task: () async => Future.delayed(Duration(seconds: 1), () => print('Queue2: 1'))));
  queue2.add(QueueItem(task: () async => Future.delayed(Duration(seconds: 3), () => print('Queue2: 2'))));
  queue2.add(QueueItem(task: () async => Future.delayed(Duration(seconds: 1), () => print('Queue2: 3'))));

  // 等待队列处理完成
  await queue.finished;
  await queue2.finished;

  // 取消监听器
  queue1itemsListener.cancel();
  queue2itemsListener.cancel();

  // 释放队列资源
  queue.dispose();
}

输出结果

运行上述代码后,控制台将输出如下内容:

Queue 1 Remaining items: 0
Queue 2 Remaining items: 0
Queue 1 Remaining items: 1
Queue 2 Remaining items: 1
Queue 1 Remaining items: 2
Queue 2 Remaining items: 2
Queue 1 Remaining items: 3
Queue 2 Remaining items: 3
Queue1: 1
Queue 1 Remaining items: 2
Queue2: 1
Queue 2 Remaining items: 2
Queue2: 3
Queue 2 Remaining items: 1
Queue1: 2
Queue 1 Remaining items: 1
Queue2: 2
Queue 2 completed
Queue 2 Remaining items: 0
Queue 2 Remaining items: 0
Queue1: 3
Queue 1 completed
Exited.

更多关于Flutter队列管理插件queue_plus的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter队列管理插件queue_plus的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


queue_plus 是一个用于 Flutter 的队列管理插件,它提供了一种简单的方式来管理和控制异步任务队列。通过 queue_plus,你可以轻松地执行任务、限制并发数、重试失败的任务等。

安装

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

dependencies:
  flutter:
    sdk: flutter
  queue_plus: ^1.0.0

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

基本用法

以下是一些 queue_plus 的基本用法示例:

1. 创建一个队列

import 'package:queue_plus/queue_plus.dart';

final queue = QueuePlus();

2. 添加任务到队列

你可以通过 add 方法将任务添加到队列中:

queue.add(() async {
  print('Task 1 started');
  await Future.delayed(Duration(seconds: 1));
  print('Task 1 completed');
});

3. 限制并发数

你可以通过 maxConcurrent 参数来限制同时执行的任务数:

final queue = QueuePlus(maxConcurrent: 2);

queue.add(() async {
  print('Task 1 started');
  await Future.delayed(Duration(seconds: 1));
  print('Task 1 completed');
});

queue.add(() async {
  print('Task 2 started');
  await Future.delayed(Duration(seconds: 1));
  print('Task 2 completed');
});

queue.add(() async {
  print('Task 3 started');
  await Future.delayed(Duration(seconds: 1));
  print('Task 3 completed');
});

在这个例子中,maxConcurrent 设置为 2,所以同时最多只有两个任务在执行。

4. 重试失败的任务

你可以通过 retries 参数来设置任务失败后的重试次数:

queue.add(
  () async {
    print('Task started');
    throw Exception('Task failed');
  },
  retries: 3,
  onRetry: (attempt) {
    print('Retrying task, attempt $attempt');
  },
);

在这个例子中,任务将会重试 3 次。

5. 任务完成回调

你可以通过 onComplete 来监听任务的完成:

queue.add(
  () async {
    print('Task started');
    await Future.delayed(Duration(seconds: 1));
    print('Task completed');
  },
  onComplete: () {
    print('Task finished successfully');
  },
);

6. 取消任务

你可以通过 cancel 方法来取消任务:

final task = queue.add(() async {
  print('Task started');
  await Future.delayed(Duration(seconds: 1));
  print('Task completed');
});

task.cancel();

7. 暂停和恢复队列

你可以通过 pauseresume 方法来暂停和恢复队列的执行:

queue.pause();

queue.resume();

完整示例

以下是一个完整的示例,展示了如何使用 queue_plus 来管理和控制任务队列:

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

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

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: Text('QueuePlus Example')),
        body: QueueExample(),
      ),
    );
  }
}

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

class _QueueExampleState extends State<QueueExample> {
  final queue = QueuePlus(maxConcurrent: 2);

  void addTask(int id) {
    queue.add(
      () async {
        print('Task $id started');
        await Future.delayed(Duration(seconds: 2));
        print('Task $id completed');
      },
      onComplete: () {
        print('Task $id finished successfully');
      },
      retries: 2,
      onRetry: (attempt) {
        print('Retrying task $id, attempt $attempt');
      },
    );
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Center(
      child: Column(
        mainAxisAlignment: MainAxisAlignment.center,
        children: [
          ElevatedButton(
            onPressed: () => addTask(1),
            child: Text('Add Task 1'),
          ),
          ElevatedButton(
            onPressed: () => addTask(2),
            child: Text('Add Task 2'),
          ),
          ElevatedButton(
            onPressed: () => addTask(3),
            child: Text('Add Task 3'),
          ),
        ],
      ),
    );
  }
}
回到顶部