flutter 与share_plus共享文本文件(csv):“无法附加文件”

uidvcgyl  于 2023-11-21  发布在  Flutter
关注(0)|答案(1)|浏览(104)

我想从Firestore获取数据,将其转换为CSV格式,然后使用用户选择的方法(例如电子邮件)共享它。我使用csv package将数据转换为CSV,path_provider获取目录以将文件写入手机,share_plus包共享文件。
但是,当我点击共享方法时,(例如Gmail,Outlook,Whatsapp),它打开了正确的应用程序,但随后我在手机上收到一条消息,如“无法附加文件”(但我的应用程序中没有错误).该文件肯定是被写入,因为我可以读取它,它回来与预期的字符串.共享返回的ShareResultStatus是'成功'有人能弄清楚它是什么吗问题是什么,如何解决?
下面是我的代码:

Future exportData() async {
    // Dummy data (in reality, this will come from Firestore)
    List<List> dummyData = [
      ['Date', 'Piece', 'Rating'],
      [DateTime.utc(2022, 05, 01), 'Sonata', 4],
      [DateTime.utc(2022, 05, 02), 'Sonata', 2],
    ];

    // Turn into CSV
    String csvData = _convertToCsv(dummyData);

    // Write to local disk
    await _writeData(csvData);

    // Share
    String filePath = await _filePath;
    final result =
        await Share.shareFilesWithResult([filePath], mimeTypes: ['text/csv']);
    print(result.status);
  }

字符串
下面是上面代码中使用的函数:

Future<String> get _filePath async {
    final directory = await getApplicationDocumentsDirectory();
    return '${directory.path}/my_practice_diary_data.csv';
  }

  Future<File> _writeData(String csvData) async {
    String filePath = await _filePath;
    final file = File(filePath);
    return file.writeAsString(csvData);
  }

  String _convertToCsv(List<List> data) {
    String result = const ListToCsvConverter().convert(data);
    return result;
  }


注:我已经尝试做这两个txt和csv文件,得到相同的结果

  • 编辑(06/06/2022):经过大量的阅读和观看YouTube视频,我已经意识到,问题是,目录getApplicationDocumentsDirectory()只能通过我的应用程序访问(因此,正在共享的应用程序,如Gmail,无法读取它).

现在我已经通过使用mailer软件包和使用用户的google凭证发送电子邮件来解决它(我遵循了这些有用的youtube教程:Flutter Tutorial - How To Send Email In Background [2021] Without BackendFlutter Tutorial - Google SignIn [2021] With Firebase Auth - Android, iOS, Flutter Web
然而,它仍然很高兴知道一个很好的方法来生成一个文件,并使用share_plus共享它,根据我原来的问题。我相信这可以通过以下两种方式之一实现:
1.找到一种方法来允许其他应用程序访问应用程序目录中的此特定文件;或者
1.想办法将文件下载到外部存储(比如下载文件夹),然后共享。(我在Android和iOS上都找不到这样做的方法)。
任何人谁知道如何做这些或任何其他解决问题的方法,请分享!

c9x0cxw0

c9x0cxw01#

我只是尝试类似的东西,这就是我如何能够与share_plus共享csv文件

// Convert the data to CSV format
                    String csvContent =
                        const ListToCsvConverter().convert(csvData);
                    final directory = await getApplicationDocumentsDirectory();
                    final csvFilePath =
                        await File('${directory.path}/gear.csv').create();
                    await csvFilePath.writeAsString(csvContent);
                    final files = <XFile>[];
                    files.add(XFile('${directory.path}/exportData.csv',
                        name: 'Gear Back Up'));

                    /// Share Plugin
                    Share.shareXFiles(files,
                        text: 'My Exported Data!');

字符串

相关问题