Flutter:如何获取“assets”目录中所有图像的名称列表?

Kos*_*dov 9 dart flutter

我有 100 张图片需要显示在列表中。我不想对所有名称进行硬编码。

如何获取图像的名称?

我想要这样的代码:

final List<String> imageNames = await WhatEver.getNamesOfImagesInAssetsDirectory();
final widgets = imageNames.map((fileName) => Image.asset('images/${fileName}.png')).toList()
Run Code Online (Sandbox Code Playgroud)

Kos*_*dov 39

我已经在一个内部实现了下面的功能 StatefulWidget

    Future _initImages() async {
      // >> To get paths you need these 2 lines
      final manifestContent = await DefaultAssetBundle.of(context).loadString('AssetManifest.json');
    
      final Map<String, dynamic> manifestMap = json.decode(manifestContent);
      // >> To get paths you need these 2 lines

      final imagePaths = manifestMap.keys
          .where((String key) => key.contains('images/'))
          .where((String key) => key.contains('.svg'))
          .toList();
    
      setState(() {
        someImages = imagePaths;
      });
    }
Run Code Online (Sandbox Code Playgroud)

AssetManifest.json 包含有关您添加的所有资产的所有数据 pubspec.yaml

  • 如果您想在没有“BuildContext”的地方执行此操作,您还可以使用“final manifestContent = wait rootBundle.loadString('AssetManifest.json');”而不是“DefaultAssetBundle”。 (11认同)

小智 8

“AssetManifest.json”很快就会被弃用,并将替换为“AssetManifest.bin”。

但我相信它仍然没有记录。如果您使用的是较新的 Flutter 版本(请参阅更新链接),有一个 api 可以获取资产列表,如下所示:

final assetManifest = await AssetManifest.loadFromAssetBundle(rootBundle);
// This returns a List<String> with all your images
final imageAssetsList = assetManifest.listAssets().where((string) => string.startsWith("assets/images/")).toList()
Run Code Online (Sandbox Code Playgroud)

在 Flutter Channel 稳定版 3.10.6 上测试

相关链接/github跟踪:

通过以二进制而不是 JSON 编码资产清单来加速首次资产加载

[跟踪] 加速资产清单加载和解析