Add few required dependencies, I have a test demo with android only. please review file_utils
and path_provider
while you implement in IOS device.
dio: ^3.0.0
path_provider: ^1.3.0
simple_permissions: ^0.1.9
file_utils: ^0.1.3
Note: simple_permissions
is disconnected please use this dependency permission_handler
You are required to add permissions on the android manifest file.
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
Sample code:
import 'dart:io';
import 'package:flutter/material.dart';
import 'package:dio/dio.dart';
import 'package:path_provider/path_provider.dart';
import 'dart:async';
import 'package:simple_permissions/simple_permissions.dart';
import 'package:file_utils/file_utils.dart';
import 'dart:math';
void main() => runApp(Downloader());
class Downloader extends StatelessWidget {
@override
Widget build(BuildContext context) => MaterialApp(
title: "File Downloader",
debugShowCheckedModeBanner: false,
home: FileDownloader(),
theme: ThemeData(primarySwatch: Colors.blue),
);
}
class FileDownloader extends StatefulWidget {
@override
_FileDownloaderState createState() => _FileDownloaderState();
}
class _FileDownloaderState extends State<FileDownloader> {
final imgUrl = "https://images6.alphacoders.com/683/thumb-1920-683023.jpg";
bool downloading = false;
var progress = "";
var path = "No Data";
var platformVersion = "Unknown";
Permission permission1 = Permission.WriteExternalStorage;
var _onPressed;
static final Random random = Random();
Directory externalDir;
@override
void initState() {
super.initState();
downloadFile();
}
Future<void> downloadFile() async {
Dio dio = Dio();
bool checkPermission1 =
await SimplePermissions.checkPermission(permission1);
// print(checkPermission1);
if (checkPermission1 == false) {
await SimplePermissions.requestPermission(permission1);
checkPermission1 = await SimplePermissions.checkPermission(permission1);
}
if (checkPermission1 == true) {
String dirloc = "";
if (Platform.isAndroid) {
dirloc = "/sdcard/download/";
} else {
dirloc = (await getApplicationDocumentsDirectory()).path;
}
var randid = random.nextInt(10000);
try {
FileUtils.mkdir([dirloc]);
await dio.download(imgUrl, dirloc + randid.toString() + ".jpg",
onReceiveProgress: (receivedBytes, totalBytes) {
setState(() {
downloading = true;
progress =
((receivedBytes / totalBytes) * 100).toStringAsFixed(0) + "%";
});
});
} catch (e) {
print(e);
}
setState(() {
downloading = false;
progress = "Download Completed.";
path = dirloc + randid.toString() + ".jpg";
});
} else {
setState(() {
progress = "Permission Denied!";
_onPressed = () {
downloadFile();
};
});
}
}
@override
Widget build(BuildContext context) => Scaffold(
appBar: AppBar(
title: Text('File Downloader'),
),
body: Center(
child: downloading
? Container(
height: 120.0,
width: 200.0,
child: Card(
color: Colors.black,
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
CircularProgressIndicator(),
SizedBox(
height: 10.0,
),
Text(
'Downloading File: $progress',
style: TextStyle(color: Colors.white),
),
],
),
),
)
: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text(path),
MaterialButton(
child: Text('Request Permission Again.'),
onPressed: _onPressed,
disabledColor: Colors.blueGrey,
color: Colors.pink,
textColor: Colors.white,
height: 40.0,
minWidth: 100.0,
),
],
)));
}
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…