Reputation: 53
How can I implement a Flutter function to asynchronously pick an image file, using isolates for background processing
Future<File?> pickImages() async {
final token = RootIsolateToken.instance;
BackgroundIsolateBinaryMessenger.ensureInitialized(token!);
final receiverPort = ReceivePort();
try {
await Isolate.spawn(_pickImage, receiverPort.sendPort);
receiverPort.listen((message) {
return message;
});
} catch (e) {
print('Error picking image: $e');
}
return null;
}
Future _pickImage(SendPort sendPort) async {
FilePickerResult? result =
await FilePicker.platform.pickFiles(allowMultiple: false);
if (result != null) {
List<File> files = result.paths.map((path) =>
File(path!)).toList();
File file = files[0];
// return file;
sendPort.send(file);
} else {
// User canceled the picker
}
}
doesnt work!
Upvotes: -1
Views: 382
Reputation: 53
Future<File?> pickImages() async {
final receiverPort = ReceivePort();
try {
final token = RootIsolateToken.instance;
SendPort sendPort = receiverPort.sendPort;
await Isolate.spawn(_pickImage, [sendPort, token]);
final completer = Completer<File?>();
receiverPort.listen((message) {
if (message is File) {
completer.complete(message);
} else {
completer.complete(null);
}
receiverPort.close();
});
return completer.future;
} catch (e) {
print('Error picking image: $e');
return null;
}
}
Future<void> _pickImage(List list) async {
final sendPort = list[0];
final token = list[1];
BackgroundIsolateBinaryMessenger.ensureInitialized(token);
FilePickerResult? result =
await FilePicker.platform.pickFiles(allowMultiple: false);
if (result != null) {
List<File> files = result.paths.map((path) => File(path!)).toList();
File file = files[0];
sendPort.send(file);
} else {
sendPort.send(null); // Signal that user canceled the picker
}
}
Upvotes: 0