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,44 +62,48 @@ class MethodChannelPrinting extends PrintingPlatform { @@ -60,44 +62,48 @@ 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']];  
64 - if (completed == false && error != null) {  
65 - job!.onCompleted!.completeError(error);  
66 - } else {  
67 - job!.onCompleted!.complete(completed); 65 + final job = _printJobs.getJob(call.arguments['job']);
  66 + if (job != null) {
  67 + if (completed == false && error != null) {
  68 + job.onCompleted!.completeError(error);
  69 + } else {
  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']]!;  
72 - job.onHtmlRendered!.complete(call.arguments['doc']); 75 + final job = _printJobs.getJob(call.arguments['job']);
  76 + if (job != null) {
  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']]!;  
76 - job.onHtmlRendered!.completeError(call.arguments['error']); 81 + final job = _printJobs.getJob(call.arguments['job']);
  82 + if (job != null) {
  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']]!;  
80 - final raster = PdfRaster(  
81 - call.arguments['width'],  
82 - call.arguments['height'],  
83 - call.arguments['image'],  
84 - );  
85 - job.onPageRasterized!.add(raster); 87 + final job = _printJobs.getJob(call.arguments['job']);
  88 + if (job != null) {
  89 + final raster = PdfRaster(
  90 + call.arguments['width'],
  91 + call.arguments['height'],
  92 + call.arguments['image'],
  93 + );
  94 + job.onPageRasterized!.add(raster);
  95 + }
86 break; 96 break;
87 case 'onPageRasterEnd': 97 case 'onPageRasterEnd':
88 - final job = _printJobs[call.arguments['job']]!;  
89 - await job.onPageRasterized!.close();  
90 - _printJobs.remove(job.index); 98 + final job = _printJobs.getJob(call.arguments['job']);
  99 + if (job != null) {
  100 + await job.onPageRasterized!.close();
  101 + _printJobs.remove(job.index);
  102 + }
91 break; 103 break;
92 } 104 }
93 } 105 }
94 106
95 - static PrintJob _newPrintJob(PrintJob job) {  
96 - job.index = _jobIndex++;  
97 - _printJobs[job.index!] = job;  
98 - return job;  
99 - }  
100 -  
101 @override 107 @override
102 Future<PrintingInfo> info() async { 108 Future<PrintingInfo> info() async {
103 _channel.setMethodCallHandler(_handleMethod); 109 _channel.setMethodCallHandler(_handleMethod);
@@ -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 }