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

DNB*_*ims 17 dart flutter

这是我的 pubspec.yaml:

  assets:
    - assets/mySecertImage.png
Run Code Online (Sandbox Code Playgroud)

这是我读回资产的方式:

  var data = await PlatformAssetBundle().load('assets/mySecertImage.png');
Run Code Online (Sandbox Code Playgroud)

我可以获取文件路径而不是直接读取它吗?如果不能这样做,是否有可能将其更改dataFile对象?谢谢。

iKK*_*iKK 18

你找到解决办法了吗?(我也在寻找同样的东西)。

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

我愿意:

  • 创建一个新的文件路径到您的文档目录(在下面的代码示例中命名为 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);
Run Code Online (Sandbox Code Playgroud)

有些人还使用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);
Run Code Online (Sandbox Code Playgroud)

对于 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);
}
Run Code Online (Sandbox Code Playgroud)

  • 请不要忘记首先将依赖项“path_provider: ^1.3.0”添加到“pubspec.yaml”,否则“getApplicationDocumentsDirectory()”会给您错误。 (2认同)

Cri*_*sti 11

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

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

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

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


小智 5

我遇到了同样的问题,但通过调用此方法解决了。

Future<File> getImageFileFromAssets(String path) async {
 final byteData = await rootBundle.load('assets/$path');
 final buffer = byteData.buffer;
 Directory tempDir = await getTemporaryDirectory();
 String tempPath = tempDir.path;
 var filePath =
  tempPath + '/file_01.tmp'; // file_01.tmp is dump file, can be anything
 return File(filePath)
  .writeAsBytes(buffer.asUint8List(byteData.offsetInBytes, 
 byteData.lengthInBytes));
}
Run Code Online (Sandbox Code Playgroud)