以下是我的pubspec.yaml:
assets: - assets/mySecertImage.png
以下是我如何回读资产:
var data = await PlatformAssetBundle().load('assets/mySecertImage.png');
我可以不直接阅读它,而是获取文件路径吗?如果不能这样做,是否可以将data更改为File对象?谢谢.
data
File
fkaflof61#
你找到解决办法了吗?(我也在寻找同样的东西)。这里有一个我追求的解决方案(出于缺乏更好的想法)......:我愿意:
以下是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上验证)...所以,它会说:
getDatabasesPath()
getApplicationDocumentsDirectory()
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在您的情况下是不同的...)如果你只想在文件不存在的情况下复制它,你可以这样写:
/Users/username/Library/Developer/CoreSimulator/Devices/AE5C3275-CD65-3537-9B32-53533B97477C/data/Containers/Data/Application/7BE2B2EE-4E45-3783-B4BD-341DA83C43BD/Documents/app.txt
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); }
i7uq4tfw2#
您无法获取资源文件的文件路径,因为与应用捆绑在一起的资源存储在归档中。请参见此处的“资产构建”部分:https://flutter.dev/docs/development/ui/assets-and-images#asset-bundling在构建过程中,Flutter将资产放入一个称为资产包的特殊存档中,应用程序在运行时从该存档中读取。
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)); }
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)); } }
oo7oh9g95#
还应确保有时需要指定路径,如下所示:'packages/$nameOfThePackage/$assetPath'如果您的资产位于单独的包中,则可能用于拆分功能。nameOfThePackage是您使用的替代包的库名称。assetPath例如是'assets/images/'
5条答案
按热度按时间fkaflof61#
你找到解决办法了吗?(我也在寻找同样的东西)。
这里有一个我追求的解决方案(出于缺乏更好的想法)......:
我愿意:
以下是Dart代码:
有些人也使用
getDatabasesPath()
而不是getApplicationDocumentsDirectory()
。但我认为在iOS模拟器上,这最终是完全相同的位置。(未在Android上验证)...所以,它会说:对于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在您的情况下是不同的...)
如果你只想在文件不存在的情况下复制它,你可以这样写:
i7uq4tfw2#
您无法获取资源文件的文件路径,因为与应用捆绑在一起的资源存储在归档中。
请参见此处的“资产构建”部分:
https://flutter.dev/docs/development/ui/assets-and-images#asset-bundling
在构建过程中,Flutter将资产放入一个称为资产包的特殊存档中,应用程序在运行时从该存档中读取。
6qftjkof3#
我也遇到了同样的问题,但通过调用这个来解决。
ccgok5k54#
Harjinder实现的替代方案:它处理路径包含目录的情况,避免重写文件
oo7oh9g95#
还应确保有时需要指定路径,如下所示:'packages/$nameOfThePackage/$assetPath'如果您的资产位于单独的包中,则可能用于拆分功能。nameOfThePackage是您使用的替代包的库名称。assetPath例如是'assets/images/'