Android 尝试使用flatter从Firebase下载PDF

Android 尝试使用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

我正在学习如何使用flatter,在this.app中,我试图从firebase
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'),