David PHAM-VAN

Improve PrintJob object

... ... @@ -4,6 +4,7 @@
- Add imageFromAssetBundle and networkImage
- Add Page orientation on PdfPreview
- Improve PrintJob object
## 5.0.0-nullsafety.1
... ...
... ... @@ -37,14 +37,16 @@ class MethodChannelPrinting extends PrintingPlatform {
_channel.setMethodCallHandler(_handleMethod);
}
static final Map<int, PrintJob> _printJobs = <int, PrintJob>{};
static int _jobIndex = 0;
static final _printJobs = PrintJobs();
/// Callbacks from platform plugin
static Future<dynamic> _handleMethod(MethodCall call) async {
switch (call.method) {
case 'onLayout':
final job = _printJobs[call.arguments['job']]!;
final job = _printJobs.getJob(call.arguments['job']);
if (job == null) {
return;
}
final format = PdfPageFormat(
call.arguments['width'],
call.arguments['height'],
... ... @@ -60,42 +62,46 @@ class MethodChannelPrinting extends PrintingPlatform {
case 'onCompleted':
final bool? completed = call.arguments['completed'];
final String? error = call.arguments['error'];
final job = _printJobs[call.arguments['job']];
final job = _printJobs.getJob(call.arguments['job']);
if (job != null) {
if (completed == false && error != null) {
job!.onCompleted!.completeError(error);
job.onCompleted!.completeError(error);
} else {
job!.onCompleted!.complete(completed);
job.onCompleted!.complete(completed);
}
}
break;
case 'onHtmlRendered':
final job = _printJobs[call.arguments['job']]!;
final job = _printJobs.getJob(call.arguments['job']);
if (job != null) {
job.onHtmlRendered!.complete(call.arguments['doc']);
}
break;
case 'onHtmlError':
final job = _printJobs[call.arguments['job']]!;
final job = _printJobs.getJob(call.arguments['job']);
if (job != null) {
job.onHtmlRendered!.completeError(call.arguments['error']);
}
break;
case 'onPageRasterized':
final job = _printJobs[call.arguments['job']]!;
final job = _printJobs.getJob(call.arguments['job']);
if (job != null) {
final raster = PdfRaster(
call.arguments['width'],
call.arguments['height'],
call.arguments['image'],
);
job.onPageRasterized!.add(raster);
}
break;
case 'onPageRasterEnd':
final job = _printJobs[call.arguments['job']]!;
final job = _printJobs.getJob(call.arguments['job']);
if (job != null) {
await job.onPageRasterized!.close();
_printJobs.remove(job.index);
break;
}
break;
}
static PrintJob _newPrintJob(PrintJob job) {
job.index = _jobIndex++;
_printJobs[job.index!] = job;
return job;
}
@override
... ... @@ -122,10 +128,10 @@ class MethodChannelPrinting extends PrintingPlatform {
String name,
PdfPageFormat format,
) async {
final job = _newPrintJob(PrintJob(
final job = _printJobs.add(
onCompleted: Completer<bool>(),
onLayout: onLayout,
));
);
final params = <String, dynamic>{
'name': name,
... ... @@ -184,9 +190,9 @@ class MethodChannelPrinting extends PrintingPlatform {
String name,
PdfPageFormat format,
) async {
final job = _newPrintJob(PrintJob(
final job = _printJobs.add(
onCompleted: Completer<bool>(),
));
);
final bytes = await onLayout(format);
... ... @@ -228,9 +234,9 @@ class MethodChannelPrinting extends PrintingPlatform {
@override
Future<Uint8List> convertHtml(
String html, String? baseUrl, PdfPageFormat format) async {
final job = _newPrintJob(PrintJob(
final job = _printJobs.add(
onHtmlRendered: Completer<Uint8List>(),
));
);
final params = <String, dynamic>{
'html': html,
... ... @@ -256,9 +262,9 @@ class MethodChannelPrinting extends PrintingPlatform {
List<int>? pages,
double dpi,
) {
final job = _newPrintJob(PrintJob(
final job = _printJobs.add(
onPageRasterized: StreamController<PdfRaster>(),
));
);
final params = <String, dynamic>{
'doc': Uint8List.fromList(document),
... ...
... ... @@ -23,7 +23,8 @@ import 'raster.dart';
/// Represents a print job to communicate with the platform implementation
class PrintJob {
/// Create a print job
PrintJob({
const PrintJob._({
required this.index,
this.onLayout,
this.onHtmlRendered,
this.onCompleted,
... ... @@ -43,5 +44,43 @@ class PrintJob {
final StreamController<PdfRaster>? onPageRasterized;
/// The Job number
int? index;
final int index;
}
/// Represents a list of print jobs
class PrintJobs {
/// Create a list print jobs
PrintJobs();
static var _currentIndex = 0;
final _printJobs = <int, PrintJob>{};
/// Add a print job to the list
PrintJob add({
LayoutCallback? onLayout,
Completer<Uint8List>? onHtmlRendered,
Completer<bool>? onCompleted,
StreamController<PdfRaster>? onPageRasterized,
}) {
final job = PrintJob._(
index: _currentIndex++,
onLayout: onLayout,
onHtmlRendered: onHtmlRendered,
onCompleted: onCompleted,
onPageRasterized: onPageRasterized,
);
_printJobs[job.index] = job;
return job;
}
/// Retrive an existing job
PrintJob? getJob(int index) {
return _printJobs[index];
}
/// remove a print job from the list
void remove(int index) {
_printJobs.remove(index);
}
}
... ...