我已经创建了一个基本示例来模拟我的问题,以下是代码:
import 'dart:async';
import 'dart:isolate';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:image/image.dart' as img;
class Home extends StatefulWidget {
const Home({super.key});
@override
State<Home> createState() => _HomeState();
}
class _HomeState extends State<Home> {
Uint8List? foto;
Future<Widget> loadImage() async {
final ByteData data = await rootBundle.load('assets/images/IMG_4510.HEIC');
foto = data.buffer.asUint8List();
return Image.memory(foto!);
}
void _rotateIsolate(SendPort sendPort) {
final ReceivePort receivePort = ReceivePort();
sendPort.send(receivePort.sendPort);
receivePort.listen((dynamic data) {
if (data is Uint8List) {
final rotatedImageBytes = _doRotate(data);
sendPort.send(rotatedImageBytes);
}
});
}
Uint8List _doRotate(Uint8List foto) {
img.Image image = img.decodeImage(foto)!;
img.Image rotatedImage = img.copyRotate(image, angle: 90);
return Uint8List.fromList(img.encodePng(rotatedImage));
}
Future<void> rotateImage() async {
final receivePort = ReceivePort();
await Isolate.spawn(_rotateIsolate, receivePort.sendPort);
final completer = Completer<Uint8List>();
receivePort.listen((message) {
completer.complete(message);
receivePort.close();
});
foto = await completer.future;
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: SafeArea(
child: Column(
children: [
FutureBuilder(
future: loadImage(),
builder: (context, snapshot) {
if (snapshot.hasData) {
return snapshot.data as Widget;
} else {
return const CircularProgressIndicator();
}
},
),
ElevatedButton(
onPressed: () => rotateImage(),
child: const Text('Rotate'),
)
],
),
),
);
}
}
当我按下按钮Rotate
flutter抛出这个异常:
Unhandled Exception: Invalid argument(s): Illegal argument in isolate message: object is unsendable - Library:'dart:async' Class: _AsyncCompleter@4048458 (see restrictions listed at `SendPort.send()` documentation for more information)
这很奇怪,因为我的代码基于this guy's work,它从网络上下载一张图片,所以我认为旋转一张图片应该是几乎相同的事情.
我还try 了一些基本的并行计算,如计算斐波纳契数列,如第this medium post节所述,但抛出了完全相同的异常.
现在我不知道是我做错了什么,还是Flutter 引擎出了什么问题.
我正在使用Flutter引擎的稳定通道的最新版本(截至今天):
Flutter (Channel stable, 3.16.8)
有人知道为什么在不同的(和测试的)场景中抛出相同的异常吗?
PS:本地资源可以是任何图像