如何将文件从internet下载并保存到Flatter/dart中的内部存储(android)中?
我需要将文件eg.jpg保存到“internalstorage/appname/files/” 如果文件夹中已存在通知,则显示通知。按下按钮/启动活动时,应将文件下载到带有dart代码的ANDROID设备的本地存储器中。 帮我找到解决办法如何将文件从internet下载并保存到Flatter/dart中的内部存储(android)中?,android,dart,flutter,storage,Android,Dart,Flutter,Storage,我需要将文件eg.jpg保存到“internalstorage/appname/files/” 如果文件夹中已存在通知,则显示通知。按下按钮/启动活动时,应将文件下载到带有dart代码的ANDROID设备的本地存储器中。 帮我找到解决办法 **code:** import 'dart:io'; import 'dart:async'; import 'package:flutter/material.dart'; import 'package:flutter_downloade
**code:**
import 'dart:io';
import 'dart:async';
import 'package:flutter/material.dart';
import 'package:flutter_downloader/flutter_downloader.dart';
import './landing_page.dart';
import 'package:dio/dio.dart';
import 'package:path_provider/path_provider.dart';
import 'package:simple_permissions/simple_permissions.dart';
import 'package:flutter/services.dart';
class MoviesPage extends StatefulWidget {
@override
State createState() => new MoviesPageState();
}
class MoviesPageState extends State<MoviesPage> {
final dUrl ="https://cdn.putlockers.es/download/0BBCA7584749D4E741747E32E6EB588AEA03E40F";
bool downloading = false;
var progressString = "";
static const MethodChannel _channel =
const MethodChannel('flutter_downloader');
@override
void initState() {
super.initState();
downloadFile();
}
Future<void> downloadFile() async {
Dio dio = Dio();
try {
var dir = await getApplicationDocumentsDirectory();
await dio.download(dUrl, "${dir.path}/file.torrent",
onProgress: (rec, total) {
print("Rec: $rec , Total: $total");
setState(() {
downloading = true;
progressString = ((rec / total) * 100).toStringAsFixed(0) + "%";
});
});
} catch (e) {
print(e);
}
setState(() {
downloading = false;
progressString = "Completed";
});
print("Download completed");
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text("AppBar"),
),
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: 20.0,
),
Text(
"Downloading File: $progressString",
style: TextStyle(
color: Colors.white,
),
)
],
),
),
)
: Text("No Data"),
),
);
}
}
**代码:**
导入“dart:io”;
导入“dart:async”;
进口“包装:颤振/材料.省道”;
进口“包装:颤振_下载器/颤振_下载器.dart”;
导入“./landing_page.dart”;
进口“包装:dio/dio.dart”;
导入“package:path_provider/path_provider.dart”;
导入“package:simple_permissions/simple_permissions.dart”;
导入“包:flifter/services.dart”;
类MoviesPage扩展StatefulWidget{
@凌驾
State createState()=>新电影页面状态();
}
类MoviesPageState扩展了状态{
最终dUrl=”https://cdn.putlockers.es/download/0BBCA7584749D4E741747E32E6EB588AEA03E40F";
bool=false;
var progressString=“”;
静态常量方法通道u通道=
const MethodChannel(“颤振下载器”);
@凌驾
void initState(){
super.initState();
下载文件();
}
Future downloadFile()异步{
Dio Dio=Dio();
试一试{
var dir=等待getApplicationDocumentsDirectory();
等待dio.download(dUrl,“${dir.path}/file.torrent”,
onProgress:(记录,总计){
打印(“记录:$Rec,总计:$Total”);
设置状态(){
下载=真;
progressString=(记录/总计)*100.ToStringsFixed(0)+“%”;
});
});
}捕获(e){
印刷品(e);
}
设置状态(){
下载=假;
progressString=“已完成”;
});
打印(“下载完成”);
}
@凌驾
小部件构建(构建上下文){
返回脚手架(
appBar:appBar(
标题:文本(“AppBar”),
),
正文:中(
儿童:下载
?容器(
身高:120.0,
宽度:200.0,
孩子:卡片(
颜色:颜色,黑色,
子:列(
mainAxisAlignment:mainAxisAlignment.center,
儿童:[
CircularProgressIndicator(),
大小盒子(
身高:20.0,
),
正文(
“正在下载文件:$progressString”,
样式:TextStyle(
颜色:颜色,白色,
),
)
],
),
),
)
:文本(“无数据”),
),
);
}
}
提前感谢。请以一种完全笨拙的方式发布您的解决方案。我已经检查了您发布的最小复制,您似乎正在使用flift插件下载该文件。我重新使用了代码中的
Future downloadFile()
,并对其进行了一些修改,以检查插件是否按预期工作。从dio插件的3.0.10版开始,dio.download()
上的onProgress
现在是onReceiveProgress
,但它基本上仍然具有相同的功能
下面是从代码中下载图像文件的方法,只需稍加修改
Future downloadFile()异步{
Dio Dio=Dio();
var dir=等待getApplicationDocumentsDirectory();
var imageDownloadPath='${dir.path}/image.jpg';
等待dio.下载(imageSrc,imageDownloadPath,
收到进度:(已收到,总计){
风险值进度=(收到/总计)*100;
debugPrint('Rec:$received,Total:$Total,$progress%”);
设置状态(){
downloadProgress=received.toDouble()/total.toDouble();
});
});
//downloadFile函数返回下载图像的路径
返回图像下载路径;
}
插件按预期工作,并成功下载图像文件。虽然我无法验证您如何确定您尝试下载的图像在复制时失败。在我的示例应用程序中,Future downloadFile()
返回存储图像路径的字符串。然后我用它来更新图像小部件以显示下载的图像-这决定了下载已经成功
下面是完整的示例应用程序
导入'dart:io';
进口“包装:dio/dio.dart”;
进口“包装:颤振/材料.省道”;
导入“package:path_provider/path_provider.dart”;
void main(){
runApp(MyApp());
}
类MyApp扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
返回材料PP(
标题:“颤振演示”,
主题:主题数据(
主样本:颜色。蓝色,
视觉密度:视觉密度。自适应平台密度,
),
主页:MyHomePage(标题:“颤振演示主页”),
);
}
}
类MyHomePage扩展StatefulWidget{
MyHomePage({Key,this.title}):超级(Key:Key);
最后的字符串标题;
@凌驾
_MyHomePageState createState()=>\u MyHomePageState();
}
类_MyHomePageState扩展状态{
最终图像src=https://picsum.photos/250?image=9';
var downloadPath='';
var downloadProgress=0.0;
@凌驾
小部件构建(构建上下文){
返回脚手架(
appBar:appBar(
标题:文本(widget.title),
),
正文:中(
子:列(
mainAxisAlignment:mainAxisAlignment.center,
儿童:[
扩展(flex:5,子项:Image.network(imageSrc)),
扩大(
弹性:2,
孩子:排(
儿童:[
升降按钮(
//从imageSrc下载显示的图像
已按下:(){
downloadFile().catchError((OneError){
debugPrint('Error downloading:$onError');
}).然后((图像路径){
debugPrint('下载成功