import 'dart:isolate'; import 'dart:typed_data'; import 'package:http/http.dart' as http; class HttpGetImage { final String url; final int count; final Map? httpHeaders; HttpGetImage({ required this.url, required this.count, required this.httpHeaders, }); Future getDataObjectIsolate() async { final ReceivePort receivePort = ReceivePort(); var data = {'sendPort': receivePort.sendPort, 'url': url, 'count': count}; if (httpHeaders != null) { data = { 'sendPort': receivePort.sendPort, 'url': url, 'headers': httpHeaders!, 'count': count, }; } final Isolate isolate = await Isolate.spawn(_isolateFetchVideo, data); try { final dynamic result = await receivePort.first; isolate.kill(); if (result is Uint8List) { return result; } else { throw Exception(); } } catch (e) { isolate.kill(); throw Exception(); } finally { receivePort.close(); } } Future _isolateFetchVideo(Map message) async { final SendPort sendPort = message['sendPort']; final String url = message['url']; int count = message['count']; Map? headers = message.containsKey("headers") ? message['headers'] : null; int time = 10; late http.Response response; do { if (time > count) { sendPort.send(null); break; } try { response = await http .get(Uri.parse(url), headers: headers) .timeout(Duration(seconds: time)); if (response.statusCode == 200) { if (response.body.isNotEmpty) { sendPort.send(null); break; } sendPort.send(response.bodyBytes); break; } time++; } catch (e) { sendPort.send(null); } } while (response.statusCode != 200); } }