David PHAM-VAN

Improve PrintJob object

@@ -4,6 +4,7 @@ @@ -4,6 +4,7 @@
4 4
5 - Add imageFromAssetBundle and networkImage 5 - Add imageFromAssetBundle and networkImage
6 - Add Page orientation on PdfPreview 6 - Add Page orientation on PdfPreview
  7 +- Improve PrintJob object
7 8
8 ## 5.0.0-nullsafety.1 9 ## 5.0.0-nullsafety.1
9 10
@@ -37,14 +37,16 @@ class MethodChannelPrinting extends PrintingPlatform { @@ -37,14 +37,16 @@ class MethodChannelPrinting extends PrintingPlatform {
37 _channel.setMethodCallHandler(_handleMethod); 37 _channel.setMethodCallHandler(_handleMethod);
38 } 38 }
39 39
40 - static final Map<int, PrintJob> _printJobs = <int, PrintJob>{};  
41 - static int _jobIndex = 0; 40 + static final _printJobs = PrintJobs();
42 41
43 /// Callbacks from platform plugin 42 /// Callbacks from platform plugin
44 static Future<dynamic> _handleMethod(MethodCall call) async { 43 static Future<dynamic> _handleMethod(MethodCall call) async {
45 switch (call.method) { 44 switch (call.method) {
46 case 'onLayout': 45 case 'onLayout':
47 - final job = _printJobs[call.arguments['job']]!; 46 + final job = _printJobs.getJob(call.arguments['job']);
  47 + if (job == null) {
  48 + return;
  49 + }
48 final format = PdfPageFormat( 50 final format = PdfPageFormat(
49 call.arguments['width'], 51 call.arguments['width'],
50 call.arguments['height'], 52 call.arguments['height'],
@@ -60,42 +62,46 @@ class MethodChannelPrinting extends PrintingPlatform { @@ -60,42 +62,46 @@ class MethodChannelPrinting extends PrintingPlatform {
60 case 'onCompleted': 62 case 'onCompleted':
61 final bool? completed = call.arguments['completed']; 63 final bool? completed = call.arguments['completed'];
62 final String? error = call.arguments['error']; 64 final String? error = call.arguments['error'];
63 - final job = _printJobs[call.arguments['job']]; 65 + final job = _printJobs.getJob(call.arguments['job']);
  66 + if (job != null) {
64 if (completed == false && error != null) { 67 if (completed == false && error != null) {
65 - job!.onCompleted!.completeError(error); 68 + job.onCompleted!.completeError(error);
66 } else { 69 } else {
67 - job!.onCompleted!.complete(completed); 70 + job.onCompleted!.complete(completed);
  71 + }
68 } 72 }
69 break; 73 break;
70 case 'onHtmlRendered': 74 case 'onHtmlRendered':
71 - final job = _printJobs[call.arguments['job']]!; 75 + final job = _printJobs.getJob(call.arguments['job']);
  76 + if (job != null) {
72 job.onHtmlRendered!.complete(call.arguments['doc']); 77 job.onHtmlRendered!.complete(call.arguments['doc']);
  78 + }
73 break; 79 break;
74 case 'onHtmlError': 80 case 'onHtmlError':
75 - final job = _printJobs[call.arguments['job']]!; 81 + final job = _printJobs.getJob(call.arguments['job']);
  82 + if (job != null) {
76 job.onHtmlRendered!.completeError(call.arguments['error']); 83 job.onHtmlRendered!.completeError(call.arguments['error']);
  84 + }
77 break; 85 break;
78 case 'onPageRasterized': 86 case 'onPageRasterized':
79 - final job = _printJobs[call.arguments['job']]!; 87 + final job = _printJobs.getJob(call.arguments['job']);
  88 + if (job != null) {
80 final raster = PdfRaster( 89 final raster = PdfRaster(
81 call.arguments['width'], 90 call.arguments['width'],
82 call.arguments['height'], 91 call.arguments['height'],
83 call.arguments['image'], 92 call.arguments['image'],
84 ); 93 );
85 job.onPageRasterized!.add(raster); 94 job.onPageRasterized!.add(raster);
  95 + }
86 break; 96 break;
87 case 'onPageRasterEnd': 97 case 'onPageRasterEnd':
88 - final job = _printJobs[call.arguments['job']]!; 98 + final job = _printJobs.getJob(call.arguments['job']);
  99 + if (job != null) {
89 await job.onPageRasterized!.close(); 100 await job.onPageRasterized!.close();
90 _printJobs.remove(job.index); 101 _printJobs.remove(job.index);
91 - break;  
92 } 102 }
  103 + break;
93 } 104 }
94 -  
95 - static PrintJob _newPrintJob(PrintJob job) {  
96 - job.index = _jobIndex++;  
97 - _printJobs[job.index!] = job;  
98 - return job;  
99 } 105 }
100 106
101 @override 107 @override
@@ -122,10 +128,10 @@ class MethodChannelPrinting extends PrintingPlatform { @@ -122,10 +128,10 @@ class MethodChannelPrinting extends PrintingPlatform {
122 String name, 128 String name,
123 PdfPageFormat format, 129 PdfPageFormat format,
124 ) async { 130 ) async {
125 - final job = _newPrintJob(PrintJob( 131 + final job = _printJobs.add(
126 onCompleted: Completer<bool>(), 132 onCompleted: Completer<bool>(),
127 onLayout: onLayout, 133 onLayout: onLayout,
128 - )); 134 + );
129 135
130 final params = <String, dynamic>{ 136 final params = <String, dynamic>{
131 'name': name, 137 'name': name,
@@ -184,9 +190,9 @@ class MethodChannelPrinting extends PrintingPlatform { @@ -184,9 +190,9 @@ class MethodChannelPrinting extends PrintingPlatform {
184 String name, 190 String name,
185 PdfPageFormat format, 191 PdfPageFormat format,
186 ) async { 192 ) async {
187 - final job = _newPrintJob(PrintJob( 193 + final job = _printJobs.add(
188 onCompleted: Completer<bool>(), 194 onCompleted: Completer<bool>(),
189 - )); 195 + );
190 196
191 final bytes = await onLayout(format); 197 final bytes = await onLayout(format);
192 198
@@ -228,9 +234,9 @@ class MethodChannelPrinting extends PrintingPlatform { @@ -228,9 +234,9 @@ class MethodChannelPrinting extends PrintingPlatform {
228 @override 234 @override
229 Future<Uint8List> convertHtml( 235 Future<Uint8List> convertHtml(
230 String html, String? baseUrl, PdfPageFormat format) async { 236 String html, String? baseUrl, PdfPageFormat format) async {
231 - final job = _newPrintJob(PrintJob( 237 + final job = _printJobs.add(
232 onHtmlRendered: Completer<Uint8List>(), 238 onHtmlRendered: Completer<Uint8List>(),
233 - )); 239 + );
234 240
235 final params = <String, dynamic>{ 241 final params = <String, dynamic>{
236 'html': html, 242 'html': html,
@@ -256,9 +262,9 @@ class MethodChannelPrinting extends PrintingPlatform { @@ -256,9 +262,9 @@ class MethodChannelPrinting extends PrintingPlatform {
256 List<int>? pages, 262 List<int>? pages,
257 double dpi, 263 double dpi,
258 ) { 264 ) {
259 - final job = _newPrintJob(PrintJob( 265 + final job = _printJobs.add(
260 onPageRasterized: StreamController<PdfRaster>(), 266 onPageRasterized: StreamController<PdfRaster>(),
261 - )); 267 + );
262 268
263 final params = <String, dynamic>{ 269 final params = <String, dynamic>{
264 'doc': Uint8List.fromList(document), 270 'doc': Uint8List.fromList(document),
@@ -23,7 +23,8 @@ import 'raster.dart'; @@ -23,7 +23,8 @@ import 'raster.dart';
23 /// Represents a print job to communicate with the platform implementation 23 /// Represents a print job to communicate with the platform implementation
24 class PrintJob { 24 class PrintJob {
25 /// Create a print job 25 /// Create a print job
26 - PrintJob({ 26 + const PrintJob._({
  27 + required this.index,
27 this.onLayout, 28 this.onLayout,
28 this.onHtmlRendered, 29 this.onHtmlRendered,
29 this.onCompleted, 30 this.onCompleted,
@@ -43,5 +44,43 @@ class PrintJob { @@ -43,5 +44,43 @@ class PrintJob {
43 final StreamController<PdfRaster>? onPageRasterized; 44 final StreamController<PdfRaster>? onPageRasterized;
44 45
45 /// The Job number 46 /// The Job number
46 - int? index; 47 + final int index;
  48 +}
  49 +
  50 +/// Represents a list of print jobs
  51 +class PrintJobs {
  52 + /// Create a list print jobs
  53 + PrintJobs();
  54 +
  55 + static var _currentIndex = 0;
  56 +
  57 + final _printJobs = <int, PrintJob>{};
  58 +
  59 + /// Add a print job to the list
  60 + PrintJob add({
  61 + LayoutCallback? onLayout,
  62 + Completer<Uint8List>? onHtmlRendered,
  63 + Completer<bool>? onCompleted,
  64 + StreamController<PdfRaster>? onPageRasterized,
  65 + }) {
  66 + final job = PrintJob._(
  67 + index: _currentIndex++,
  68 + onLayout: onLayout,
  69 + onHtmlRendered: onHtmlRendered,
  70 + onCompleted: onCompleted,
  71 + onPageRasterized: onPageRasterized,
  72 + );
  73 + _printJobs[job.index] = job;
  74 + return job;
  75 + }
  76 +
  77 + /// Retrive an existing job
  78 + PrintJob? getJob(int index) {
  79 + return _printJobs[index];
  80 + }
  81 +
  82 + /// remove a print job from the list
  83 + void remove(int index) {
  84 + _printJobs.remove(index);
  85 + }
47 } 86 }