Android 尝试使用flatter从Firebase下载PDF
我正在学习如何使用flatter,在this.app中,我试图从firebaseAndroid 尝试使用flatter从Firebase下载PDF,android,ios,flutter,pdf,download,Android,Ios,Flutter,Pdf,Download,我正在学习如何使用flatter,在this.app中,我试图从firebasefinal imgUrl=manualis.data()['documento']下载一个PDF文件\u HomeState(); } 类(HomeState扩展状态){ int _currentIndex=0; 最终选项卡=[ //人工制表 居中( 儿童:(脚手架)( 正文:StreamBuilder( 流:FirebaseFirestore.instance.collection('Manualis').snap
final imgUrl=manualis.data()['documento']下载一个PDF文件代码><我用来从Firebase数据库获取链接的最后一个imgURL
这是错误:
I/flutter (12444): error is
I/flutter (12444): FileSystemException: Cannot open file, path = '/storage/emulated/0/Download/newtask1.pdf' (OS Error: Operation not permitted, errno = 1)
这里是de代码
import 'dart:typed_data';
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:dio/dio.dart';
import 'package:ext_storage/ext_storage.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:esys_flutter_share/esys_flutter_share.dart';
import 'dart:io';
import 'package:flutter_cached_pdfview/flutter_cached_pdfview.dart';
import 'package:permission_handler/permission_handler.dart';
class Home extends StatefulWidget {
@override
_HomeState createState() => _HomeState();
}
class _HomeState extends State<Home> {
int _currentIndex = 0;
final tabs = [
//TAB DE MANUAIS
Center(
child: (Scaffold(
body: StreamBuilder(
stream: FirebaseFirestore.instance.collection('manuais').snapshots(),
builder: (context, snapshot) {
if (snapshot.data == null) return CircularProgressIndicator();
return Container(
padding: EdgeInsets.all(16),
child: ListView.builder(
itemCount: snapshot.data.documents.length,
itemBuilder: (context, index) {
DocumentSnapshot manuais =
snapshot.data.documents[index];
final imgUrl = manuais.data()['documento'];
var dio = Dio();
return Card(
color: Colors.grey[250],
child: Container(
padding: EdgeInsets.all(10),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
Image.network(manuais.data()['logo'].toString(), width: 32,
),
Center(
child: Text(
(manuais.data()['nome'].toString()),
maxLines: 1,
overflow: TextOverflow.ellipsis,
style: TextStyle(fontSize: 16),
),
),
ButtonBar(
children: <Widget>[
//BOTAO DE DOWNLOAD
FlatButton(
child: const Text('Download'),
onPressed: () async {
String path =
await ExtStorage.getExternalStoragePublicDirectory(
ExtStorage.DIRECTORY_DOWNLOADS);
String fullPath = '$path/newtask1.pdf';
download2(dio, imgUrl, fullPath);
},
),
FlatButton(
child: const Text('Compartilhar'),
onPressed: () async {
if (snapshot.data == null) return CircularProgressIndicator();
var request = await HttpClient().getUrl(Uri.parse(manuais.data()['documento']));
var response = await request.close();Uint8List bytes = await consolidateHttpClientResponseBytes(response);
await Share.file(
'ESYS AMLOG',
'Manual.pdf',
bytes,
'image/jpg');
}),
],
),
],
),
),
);
}),
);
})))),
//TAB DE PRODUCAO
Center(
child: (Scaffold(
body: StreamBuilder(
stream: FirebaseFirestore.instance.collection('producao').snapshots(),
builder: (context, snapshot) {
if (snapshot.data == null) return CircularProgressIndicator();
return Container(
padding: EdgeInsets.all(16),
child: ListView.builder(
itemCount: snapshot.data.documents.length,
itemBuilder: (context, index) {
DocumentSnapshot producao =
snapshot.data.documents[index];
return Card(
color: Colors.grey[250],
child: Container(
padding: EdgeInsets.all(10),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
Center(
child: Image.network(producao.data()['img'].toString(), width: 260,
),
),
Text(
(producao.data()['data'].toString()),
maxLines: 1,
overflow: TextOverflow.ellipsis,
style: TextStyle(fontSize: 22),
),
Text(
(producao.data()['detail'].toString()),
style: TextStyle(fontSize: 16),
),
ButtonBar(
children: <Widget>[
FlatButton(
child: const Text('DETALHES'),
onPressed: () {}),
FlatButton(
child: const Text('COMPARTILHAR'),
onPressed: () async {
if (snapshot.data == null) return CircularProgressIndicator();
var request = await HttpClient().getUrl(Uri.parse(producao.data()['img']));
var response = await request.close();Uint8List bytes = await consolidateHttpClientResponseBytes(response);
await Share.file(
'ESYS AMLOG',
'amlog.jpg',
bytes,
'image/jpg');
}),
],
),
],
),
),
);
}),
);
})))),
Center(child: Text('Documentos')),
];
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text('Área do Cliente')),
body: tabs[_currentIndex],
bottomNavigationBar: BottomNavigationBar(
currentIndex: _currentIndex,
type: BottomNavigationBarType.shifting,
iconSize: 28,
items: [
BottomNavigationBarItem(
icon: Icon(Icons.picture_as_pdf),
title: Text('Manuais'),
backgroundColor: Colors.indigo),
BottomNavigationBarItem(
icon: Icon(Icons.build),
title: Text('Produção'),
backgroundColor: Colors.indigo),
BottomNavigationBarItem(
icon: Icon(Icons.folder),
title: Text('Documentos'),
backgroundColor: Colors.indigo,
)
],
onTap: (index) {
setState(() {
_currentIndex = index;
});
},
),
);
}
}
void initState(){
getPermission();
}
void getPermission() async{
print('getPermission');
await PermissionHandler().requestPermissions([PermissionGroup.storage]);
}
Future download2(Dio dio, String url, String savePath) async {
try{
var showDownloadProgress;
Response response = await dio.get(
url,
onReceiveProgress: showDownloadProgress,
options: Options(
responseType: ResponseType.bytes,
followRedirects: false,
validateStatus: (status) {
return status < 500;
}),
);
File file = File(savePath);
var raf = file.openSync(mode: FileMode.write);
raf.writeStringSync(response.data);
await raf.close();
} catch (e) {
print('error is');
print(e);
}
}
```
导入'dart:typed_data';
导入“包:cloud_firestore/cloud_firestore.dart”;
进口“包装:dio/dio.dart”;
导入“package:ext_storage/ext_storage.dart”;
进口“包装:颤振/基础.dart”;
进口“包装:颤振/材料.省道”;
导入“包:esys_flatter_share/esys_flatter_share.dart”;
导入“dart:io”;
导入“包:flatter_cached_pdfview/flatter_cached_pdfview.dart”;
导入“package:permission_handler/permission_handler.dart”;
类Home扩展了StatefulWidget{
@凌驾
_HomeState createState()=>\u HomeState();
}
类(HomeState扩展状态){
int _currentIndex=0;
最终选项卡=[
//人工制表
居中(
儿童:(脚手架)(
正文:StreamBuilder(
流:FirebaseFirestore.instance.collection('Manualis').snapshots(),
生成器:(上下文,快照){
if(snapshot.data==null)返回CircularProgressIndicator();
返回容器(
填充:边缘设置。全部(16),
子项:ListView.builder(
itemCount:snapshot.data.documents.length,
itemBuilder:(上下文,索引){
文档快照手册=
快照.数据.文档[索引];
final imgUrl=manuais.data()['documento'];
var-dio=dio();
回程卡(
颜色:颜色。灰色[250],
子:容器(
填充:边缘设置。全部(10),
子:列(
crossAxisAlignment:crossAxisAlignment.start,
儿童:[
Image.network(manualis.data()['logo'].toString(),宽度:32,
),
居中(
子:文本(
(manualis.data()['nome'].toString()),
maxLines:1,
溢出:TextOverflow.省略号,
样式:TextStyle(字体大小:16),
),
),
钮扣杆(
儿童:[
//博陶德下载
扁平按钮(
child:const Text('下载'),
onPressed:()异步{
字符串路径=
等待ExtStorage.getExternalStoragePublicDirectory(
ExtStorage.DIRECTORY_下载);
字符串fullPath='$path/newtask1.pdf';
下载2(dio、imgUrl、fullPath);
},
),
扁平按钮(
子项:const Text('Compartilhar'),
onPressed:()异步{
if(snapshot.data==null)返回CircularProgressIndicator();
var request=wait HttpClient().getUrl(Uri.parse(manuais.data()['documento']);
var response=await request.close();Uint8List bytes=await consolidateHttpClientResponseBytes(响应);
等待Share.file(
“ESYS AMLOG”,
“Manual.pdf”,
字节,
"image/jpg";;
}),
],
),
],
),
),
);
}),
);
})))),
//产品标签
居中(
儿童:(脚手架)(
正文:StreamBuilder(
流:FirebaseFirestore.instance.collection('producao').snapshots(),
生成器:(上下文,快照){
if(snapshot.data==null)返回CircularProgressIndicator();
返回容器(
填充:边缘设置。全部(16),
子项:ListView.builder(
itemCount:snapshot.data.documents.length,
itemBuilder:(上下文,索引){
文档快照产品=
快照.数据.文档[索引];
回程卡(
颜色:颜色。灰色[250],
子:容器(
填充:边缘设置。全部(10),
子:列(
crossAxisAlignment:crossAxisAlignment.start,
儿童:[
居中(
子项:Image.network(producao.data()['img'].toString(),宽度:260,
),
final taskId = await FlutterDownloader.enqueue(
url: 'your download link',
savedDir: 'directory/your/folder',
showNotification: true, // show download progress in status bar (for Android)
openFileFromNotification: true, // click on notification to open downloaded file (for Android)
);
PDF().cachedFromUrl('your download link'),