这是我的pubspec.yaml:
assets:
- assets/mySecertImage.png
这是我读回资产的方式:
var data = await PlatformAssetBundle().load('assets/mySecertImage.png');
代替直接读取它,我可以获取文件路径吗?如果无法这样做,是否可以将data
更改为File
对象?谢谢。
答案 0 :(得分:1)
您找到解决方案了吗? (我也在寻找相同的东西。)
这是我所追求的解决方法(由于缺乏更好的主意)...:
我这样做:
这是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将资产放入一个特殊的档案中,该档案称为 应用在运行时从中读取的资产包。