【问题标题】:Inside Flutter, copy large file from Assets Folder to Application Documents Folder在 Flutter 中,将大文件从 Assets 文件夹复制到 Application Documents 文件夹
【发布时间】:2019-01-12 14:59:08
【问题描述】:

我尝试使用大型数据库文件。因此,我的代码将此文件从 Assets 文件夹复制到 Application-Documents-Folder,如下面的代码示例所示。

对于小文件,我的代码工作得很好,我可以很好地使用我的数据库。

但是,如果我尝试使用较大的 db 文件 (>665MB),事情就会开始崩溃,就像我的 Flutter 应用程序的 Android 部分一样。 (事实上​​,iOS 工作得非常好,不管 db-File 真的有多大......)。仅适用于 Android,大型 db-File 会破坏事物。

以下 Dart 代码不适用于 Android 中的大文件 (>665MB) - (但它适用于小文件):

  Future<Database> initializeDatabase() async {

    Directory directory = await getApplicationDocumentsDirectory();
    var dbPath = join(directory.path, "ch_departures.db");

    // copy db file from Assets folder to Documents folder (only if not already there...)    
    if (FileSystemEntity.typeSync(dbPath) == FileSystemEntityType.notFound) {
     ByteData data = await rootBundle.load("assets/ch_departures.db");
     writeToFile(data, dbPath);
    }

    // Open/create the database at a given path
    var departuresDatabase = await openDatabase(dbPath);
    return departuresDatabase;
  }

  // HERE IS WHERE THE CODE CRASHES (WHEN TRYING TO WRITE THE LOADED BYTES)
  void writeToFile(ByteData data, String path) {
    final buffer = data.buffer;
    return new File(path).writeAsBytesSync(
      buffer.asUint8List(data.offsetInBytes, data.lengthInBytes));
  }

我尝试使用我的 Flutter 应用的 Android 部分的 gradle.properties 文件。

在 gradle.properties 里面,我试过了:

org.gradle.jvmargs=-Xmx3g -XX:MaxPermSize=2048m

但不幸的是,没有成功。

您对如何使用大型 (>665MB) 文件完成所有这些工作有任何想法吗????

【问题讨论】:

  • 它是如何失败的?有任何错误信息吗?
  • 不——根本没有错误信息!!不幸的是,完全崩溃,没有任何消息....
  • 我也尝试过原生插件。我在 iOS 上取得了成功(因为我知道 Swift) - 但我不知道如何在 Kotlin 中为原生 Android 部分做到这一点......但我认为,这样一个简单的文件副本应该在 Flutter 中工作(不走这条路使用本机代码),不是吗?除了 Assets 文件夹之外,有什么方法可以直接将文件提供给二进制文件,然后从 Flutter 应用程序(即 iOS 和 Android)访问它 - 即无需将其从 Assets 文件夹复制到 Application Documents 文件夹? ?
  • 如果我的所有想法都行不通 - 原生 Kotlin 代码将如何将资产文件复制到 Android 原生插件中的应用程序文档文件夹?
  • flutter.io/docs/development/ui/… 提供了一些有关如何使资产可用于本机平台的信息。我可以想象这个问题是由巨大的内存使用引起的。整个文件被读入内存,然后写回。最好作为流读取并将流转发到目标文件或使用一些操作系统复制功能。

标签: android ios file dart flutter


【解决方案1】:

我遇到的这个 Flutter 的大文件拷贝问题终于有了解决方案。我创建了一个 Flutter 插件,分别在 iOS 和 Android 中进行本地文件复制。

The Flutter plugin is called large_file_copy and can be found here.

【讨论】:

  • 这看起来对我来说是一个完美的解决方案,但我在构建项目时遇到错误:Android Gradle 插件仅支持 Kotlin Gradle 插件版本 1.3.10 及更高版本。以下依赖项不满足所需版本:project ':large_file_copy' -> org.jetbrains.kotlin:kotlin-gradle-plugin:1.2.71。你有可用的更新吗?
【解决方案2】:

我遇到了同样的问题,即从资产目录将大型 SQLite 文件复制到应用程序文件夹。 我找不到任何好的解决方案。

所以我最终通过压缩来缩小 SQLite 的大小。然后我将压缩文件复制到应用程序文档目录并提取数据库。 如果资产目录有大文件,可以将其压缩成拆分文件,并使用“writeToFile”功能一一复制...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-23
    • 2018-05-23
    • 1970-01-01
    • 1970-01-01
    • 2013-01-02
    • 2012-06-13
    相关资源
    最近更新 更多