Here is my pubspec.yaml:
assets:
- assets/mySecertImage.png
Here is how I read back the assets:
var data = await PlatformAssetBundle().load('assets/mySecertImage.png');
Instead of reading it directly, can I get the file path instead? If it is not possible to do so, it is possible to change the data
to become a File
object? Thanks.
Have you found a solution ? (I am looking for the same as well).
Here is a workaround that I pursue (out of lack of a better idea)... :
I do:
Here is the Dart-code:
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);
Some people also work with the getDatabasesPath()
instead of getApplicationDocumentsDirectory()
. But I figured that on an iOS-Simulator this ends up being the exact same location. (not verified on Android)... So, it would say:
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);
For an iOS-Simulator: In both above examples, you can find your copied file under the folder:
/Users/username/Library/Developer/CoreSimulator/Devices/AE5C3275-CD65-3537-9B32-53533B97477C/data/Containers/Data/Application/7BE2B2EE-4E45-3783-B4BD-341DA83C43BD/Documents/app.txt
(of course, the UUID's being different in your case...)
And if you want to copy the file only if it does not exist already, you could write:
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);
}
You can not get the file path of an asset file, because assets, that are bundled with your app, are stored inside an archive.
See the "Asset building" section here:
https://flutter.dev/docs/development/ui/assets-and-images#asset-bundling
During a build, Flutter places assets into a special archive called the asset bundle that apps read from at runtime.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With