how to use isolate for pick file?

109 Views Asked by At

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!

1

There are 1 best solutions below

0
On
    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 tocken = list[1];
    BackgroundIsolateBinaryMessenger.ensureInitialized(tocken);

   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
  }
}