如何在混乱中获取资产的文件路径?

时间:2018-09-16 11:43:02

标签: dart flutter

这是我的pubspec.yaml:

  assets:
    - assets/mySecertImage.png

这是我读回资产的方式:

  var data = await PlatformAssetBundle().load('assets/mySecertImage.png');

代替直接读取它,我可以获取文件路径吗?如果无法这样做,是否可以将data更改为File对象?谢谢。

2 个答案:

答案 0 :(得分:1)

您找到解决方案了吗? (我也在寻找相同的东西。)

这是我所追求的解决方法(由于缺乏更好的主意)...:

我这样做:

  • 为您的Documents-目录创建一个新的File-path (在下面的代码示例中命名为app.txt)
  • 将资产文件夹中的文件复制到此 文档目录位置
  • 从现在开始使用复制的文件(如果需要,您现在可以在其中拥有文件路径和字节内容)

这是Dart代码:

import 'package:path/path.dart';

Directory directory = await getApplicationDocumentsDirectory();
var dbPath = join(directory.path, "app.txt");
ByteData data = await rootBundle.load("assets/demo.txt");
List<int> bytes = data.buffer.asUint8List(data.offsetInBytes, data.lengthInBytes);
await File(dbPath).writeAsBytes(bytes);

有些人也使用getDatabasesPath()而不是getApplicationDocumentsDirectory()。但是我发现在iOS模拟器上,这最终是完全相同的位置。 (未经Android验证)...因此,它会说:

var dbDir = await getDatabasesPath();
var dbPath = join(dbDir, "app.txt");
ByteData data = await rootBundle.load("assets/demo.txt");
List<int> bytes = data.buffer.asUint8List(data.offsetInBytes, data.lengthInBytes);
await File(dbPath).writeAsBytes(bytes);

对于iOS模拟器:在以上两个示例中,您都可以在以下文件夹中找到复制的文件:

/Users/username/Library/Developer/CoreSimulator/Devices/AE5C3275-CD65-3537-9B32-53533B97477C/data/Containers/Data/Application/7BE2B2EE-4E45-3783-B4BD-341DA83C43BD/Documents/app.txt

(当然,您的UUID有所不同...)

如果只想复制尚不存在的文件,则可以这样写:

Directory directory = await getApplicationDocumentsDirectory();
var dbPath = join(directory.path, "app.txt");
if (FileSystemEntity.typeSync(dbPath) == FileSystemEntityType.notFound) {
  ByteData data = await rootBundle.load("assets/demo.txt");
  List<int> bytes = data.buffer.asUint8List(data.offsetInBytes, data.lengthInBytes);
  await File(dbPath).writeAsBytes(bytes);
}

答案 1 :(得分:0)

您无法获取资产文件的文件路径,因为与您的应用程序捆绑在一起的资产存储在存档中。

请参阅此处的“资产建筑物”部分:

https://flutter.dev/docs/development/ui/assets-and-images#asset-bundling

在构建过程中,Flutter将资产放入一个特殊的档案中,该档案称为 应用在运行时从中读取的资产包。