Last active
February 20, 2024 17:12
-
-
Save ajmaln/c591cfb71d66bb6e688fe7027cbbe606 to your computer and use it in GitHub Desktop.
Download file with progress in Dart/Flutter using 'http' package
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import 'dart:typed_data'; | |
import 'dart:io'; | |
import 'package:http/http.dart'; | |
import 'package:path_provider/path_provider.dart'; | |
downloadFile(String url, {String filename}) async { | |
var httpClient = http.Client(); | |
var request = new http.Request('GET', Uri.parse(url)); | |
var response = httpClient.send(request); | |
String dir = (await getApplicationDocumentsDirectory()).path; | |
List<List<int>> chunks = new List(); | |
int downloaded = 0; | |
response.asStream().listen((http.StreamedResponse r) { | |
r.stream.listen((List<int> chunk) { | |
// Display percentage of completion | |
debugPrint('downloadPercentage: ${downloaded / r.contentLength * 100}'); | |
chunks.add(chunk); | |
downloaded += chunk.length; | |
}, onDone: () async { | |
// Display percentage of completion | |
debugPrint('downloadPercentage: ${downloaded / r.contentLength * 100}'); | |
// Save the file | |
File file = new File('$dir/$filename'); | |
final Uint8List bytes = Uint8List(r.contentLength); | |
int offset = 0; | |
for (List<int> chunk in chunks) { | |
bytes.setRange(offset, offset + chunk.length, chunk); | |
offset += chunk.length; | |
} | |
await file.writeAsBytes(bytes); | |
return; | |
}); | |
}); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
How to implement error handling? I tried implementing onError: (handleError), where i try to show a snackbar if download fails due to loss of internet connection ,but its not working.