Showing
3 changed files
with
84 additions
and
38 deletions
@@ -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 | } |
-
Please register or login to post a comment