dart 如何使资产的文件路径处于抖动状态?

2ic8powd  于 2023-09-28  发布在  其他
关注(0)|答案(5)|浏览(73)

以下是我的pubspec.yaml:

assets:
    - assets/mySecertImage.png

以下是我如何回读资产:

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

我可以不直接阅读它,而是获取文件路径吗?如果不能这样做,是否可以将data更改为File对象?谢谢.

fkaflof6

fkaflof61#

你找到解决办法了吗?(我也在寻找同样的东西)。
这里有一个我追求的解决方案(出于缺乏更好的想法)......:
我愿意:

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

以下是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
(of当然,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);
}
i7uq4tfw

i7uq4tfw2#

您无法获取资源文件的文件路径,因为与应用捆绑在一起的资源存储在归档中。
请参见此处的“资产构建”部分:
https://flutter.dev/docs/development/ui/assets-and-images#asset-bundling
在构建过程中,Flutter将资产放入一个称为资产包的特殊存档中,应用程序在运行时从该存档中读取。

6qftjkof

6qftjkof3#

我也遇到了同样的问题,但通过调用这个来解决。

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));
}
ccgok5k5

ccgok5k54#

Harjinder实现的替代方案:它处理路径包含目录的情况,避免重写文件

Future<File> _getImageFileFromAssets(String path) async {
    Directory tempDir = await getTemporaryDirectory();
    String tempPath = tempDir.path;
    var filePath = "$tempPath/$path";
    var file = File(filePath);
    if (file.existsSync()) {
      return file;
    } else {
      final byteData = await rootBundle.load('assets/$path');
      final buffer = byteData.buffer;
      await file.create(recursive: true);
      return file
          .writeAsBytes(buffer.asUint8List(byteData.offsetInBytes,
          byteData.lengthInBytes));
    }
  }
oo7oh9g9

oo7oh9g95#

还应确保有时需要指定路径,如下所示:'packages/$nameOfThePackage/$assetPath'如果您的资产位于单独的包中,则可能用于拆分功能。nameOfThePackage是您使用的替代包的库名称。assetPath例如是'assets/images/'

相关问题