task_queue.dart 939 B

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. import 'dart:convert';
  2. import 'package:fis_common/logger/logger.dart';
  3. import 'package:flutter/foundation.dart';
  4. class WhiteBoardTaskQueue {
  5. WhiteBoardTaskQueue({required this.handler});
  6. bool _working = false;
  7. List<String> _dataQueue = [];
  8. final AsyncValueSetter<Map<String, dynamic>> handler;
  9. bool get working => _working;
  10. void add(String data) {
  11. _dataQueue.add(data);
  12. _start();
  13. }
  14. void _start() async {
  15. if (_working) return;
  16. _working = true;
  17. while (_working) {
  18. if (_dataQueue.isEmpty) {
  19. _stop(); // 空闲暂时中止循环
  20. break;
  21. }
  22. await _handleNext();
  23. }
  24. }
  25. void _stop() {
  26. _working = false;
  27. }
  28. Future<void> _handleNext() async {
  29. final data = _dataQueue.removeAt(0);
  30. try {
  31. final map = jsonDecode(data);
  32. await handler(map);
  33. } catch (e) {
  34. logger.e("[WhiteBoardTaskQueue] handle error. data: $data", e);
  35. }
  36. }
  37. }