Showing
3 changed files
with
72 additions
and
26 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,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 | } |
-
Please register or login to post a comment