How do I get the Asset's file path in flutter?

后端 未结 2 2028
梦毁少年i
梦毁少年i 2020-12-16 00:46

Here is my pubspec.yaml:

  assets:
    - assets/mySecertImage.png

Here is how I read back the assets:

  var data = await Pl         


        
相关标签:
2条回答
  • 2020-12-16 01:22

    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:

    • create a new File-path to your Documents-directory (named app.txt in the below code-example)
    • copy the File sitting in your assets folder to this Documents-directory location
    • work with the copied file from now on (where you now have File-path and even Byte-content if needed)

    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);
    }
    
    0 讨论(0)
  • 2020-12-16 01:25

    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.

    0 讨论(0)
提交回复
热议问题