Skip to content

Commit 7f05c9b

Browse files
myxzlpltkSaddam Sinatrya
and
Saddam Sinatrya
authored
Migrate js interop fixes #297 (#306)
Co-authored-by: Saddam Sinatrya <[email protected]>
1 parent 78f98ad commit 7f05c9b

File tree

5 files changed

+42
-61
lines changed

5 files changed

+42
-61
lines changed
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
1-
@JS('console')
21
library log;
32

4-
import 'package:js/js.dart';
3+
import 'dart:developer' as dev;
4+
import 'dart:js_interop';
55

6-
external void log(dynamic tag, dynamic msg);
6+
@JS('console.log')
7+
external void log(JSAny? tag, JSAny? msg);
78

89
bool showLog = false;
910

@@ -15,7 +16,6 @@ void jsLog(dynamic tag, dynamic msg) {
1516

1617
void dartLog(Object? msg) {
1718
if (showLog) {
18-
// ignore: avoid_print
19-
print(msg.toString());
19+
dev.log(msg.toString());
2020
}
2121
}

packages/flutter_image_compress_web/lib/src/pica.dart

+16-27
Original file line numberDiff line numberDiff line change
@@ -1,34 +1,21 @@
1-
@JS()
21
library pica;
32

43
import 'dart:convert';
5-
import 'dart:html';
4+
import 'dart:js_interop';
65
import 'dart:typed_data';
76

87
import 'package:flutter_image_compress_platform_interface/flutter_image_compress_platform_interface.dart';
9-
import 'package:js/js.dart';
10-
import 'package:js/js_util.dart';
8+
import 'package:web/web.dart';
119

12-
import 'window.dart';
1310
import 'log.dart' as logger;
11+
import 'util.dart';
12+
import 'window.dart';
1413

15-
@JS('pica.resize')
16-
external dynamic resize(
17-
ImageBitmap imageBitmap,
18-
CanvasElement canvas,
19-
);
20-
21-
@JS()
22-
@staticInterop
23-
class Pica {}
24-
25-
extension PicaExt on Pica {
26-
external dynamic resize(
27-
ImageBitmap imageBitmap,
28-
CanvasElement canvas,
14+
extension type Pica._(JSObject _) implements JSObject {
15+
external JSPromise resize(
16+
ImageBitmap from,
17+
HTMLCanvasElement to,
2918
);
30-
31-
external dynamic init();
3219
}
3320

3421
Future<Uint8List> resizeWithList({
@@ -39,14 +26,14 @@ Future<Uint8List> resizeWithList({
3926
int quality = 88,
4027
}) async {
4128
final Stopwatch stopwatch = Stopwatch()..start();
42-
final pica = jsWindow.pica() as Pica;
29+
final pica = window.pica();
4330
logger.jsLog('The pica instance', pica);
4431
logger.jsLog('src image buffer', buffer);
4532
logger.dartLog('src image buffer length: ${buffer.length}');
46-
final bitmap = await convertUint8ListToBitmap(buffer);
33+
final bitmap = await buffer.toImageBitmap();
4734

48-
final srcWidth = bitmap.width!;
49-
final srcHeight = bitmap.height!;
35+
final srcWidth = bitmap.width;
36+
final srcHeight = bitmap.height;
5037

5138
final ratio = srcWidth / srcHeight;
5239

@@ -55,8 +42,10 @@ Future<Uint8List> resizeWithList({
5542

5643
logger.jsLog('target size', '$width x $height');
5744

58-
final canvas = CanvasElement(width: width, height: height);
59-
await promiseToFuture(pica.resize(bitmap, canvas));
45+
final canvas = HTMLCanvasElement();
46+
canvas.width = width;
47+
canvas.height = height;
48+
await pica.resize(bitmap, canvas).toDart;
6049
final blob = canvas.toDataUrl(format.type, quality / 100);
6150
final str = blob.split(',')[1];
6251

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
library util;
2+
3+
import 'dart:js_interop';
4+
import 'dart:typed_data';
5+
6+
import 'package:web/web.dart';
7+
8+
extension Uint8ListExtension on Uint8List {
9+
Future<ImageBitmap> toImageBitmap() async {
10+
final buffer = this;
11+
final blob = Blob([buffer.toJS].toJS);
12+
final bitmap = await window.createImageBitmap(blob).toDart;
13+
return bitmap;
14+
}
15+
}
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,8 @@
1-
@JS()
21
library window;
32

4-
import 'dart:html';
5-
import 'dart:typed_data';
3+
import 'package:web/web.dart';
4+
import 'pica.dart';
65

7-
import 'package:js/js.dart';
8-
import 'package:js/js_util.dart';
9-
10-
@JS()
11-
@staticInterop
12-
class JSWindow {}
13-
14-
extension JSWindowExtension on JSWindow {
15-
external Function get createImageBitmap;
16-
external Function get pica;
17-
}
18-
19-
Future<ImageBitmap> convertUint8ListToBitmap(Uint8List buffer) async {
20-
final blob = Blob([buffer]);
21-
22-
final result = await jsWindow.createImageBitmap(blob);
23-
final bitmap = await promiseToFuture(result);
24-
return bitmap;
25-
}
26-
27-
JSWindow get jsWindow => window as JSWindow;
28-
29-
extension FutureDynamicExtension on dynamic {
30-
Future<T> toFuture<T>() => promiseToFuture(this);
6+
extension WindowExtension on Window {
7+
external Pica pica();
318
}

packages/flutter_image_compress_web/pubspec.yaml

+2-2
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ version: 0.1.4+1
44
repository: https://github.com/fluttercandies/flutter_image_compress
55

66
environment:
7-
sdk: '>=2.16.0 <4.0.0'
7+
sdk: '>=3.3.0 <4.0.0'
88
flutter: ">=2.5.0"
99

1010
dependencies:
@@ -14,7 +14,7 @@ dependencies:
1414
sdk: flutter
1515

1616
flutter_image_compress_platform_interface: ^1.0.5
17-
js: '>=0.6.0 <0.8.0'
17+
web: ^0.5.1
1818

1919
dev_dependencies:
2020
flutter_test:

0 commit comments

Comments
 (0)