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; | |
}); | |
}); | |
} |
This really should stream the chunks into the file as it goes instead of holding them in memory.
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.
@flutternoob My solution was to wrap the entire thing in an try/catch
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
thank you for answering i have a code for uploading but when i press upload button the percentage inceases if it's 100 its increases to 200
content of uploading function
variables