You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter中如何获取assets目录下指定文件夹内的所有子文件夹?

解决Flutter中无法遍历Assets目录的问题

问题原因

Flutter的assets目录在编译后会被打包进应用的资源包(APK/IPA)中,并非设备文件系统中的真实目录。直接用Dart的Directory类访问assets/images/会触发PathNotFoundException,因为这个路径在设备文件系统中不存在。

正确解决方案

方法1:通过AssetManifest获取已声明的Assets

若已在pubspec.yaml中正确声明目标assets目录及子内容,可借助Flutter自动生成的AssetManifest.json获取所有已注册的资源路径,再筛选出目标文件夹下的内容:

import 'package:flutter/services.dart';
import 'dart:convert';

Future<void> listImagesAssets() async {
  // 加载AssetManifest文件,获取所有已注册的assets路径
  final manifestString = await rootBundle.loadString('AssetManifest.json');
  final Map<String, dynamic> manifestMap = json.decode(manifestString);

  // 筛选出assets/images/路径下的所有资源(含子文件夹内容)
  final targetAssets = manifestMap.keys.where((path) => path.startsWith('assets/images/'));

  for (var assetPath in targetAssets) {
    print('找到资源:$assetPath');
  }
}

注意:

  • 确保pubspec.yaml中正确声明目标目录,若存在嵌套子文件夹,可使用通配符assets/images/**递归包含所有子内容(需Flutter版本支持),或显式声明子目录
  • AssetManifest.json由Flutter自动生成,无需手动创建

方法2:预存目录结构(适配动态子文件夹场景)

若assets目录结构需动态调整,或不想在pubspec中逐个声明子文件夹,可在目标目录下创建一个JSON文件维护目录结构:

  1. 创建assets/images/directory_structure.json,内容示例:
{
  "subfolders": [
    "assets/images/animals",
    "assets/images/landscapes",
    "assets/images/portraits"
  ],
  "files": [
    "assets/images/banner.png",
    "assets/images/animals/cat.png"
  ]
}
  1. 在pubspec.yaml中添加该JSON文件到assets声明:
flutter:
  assets:
    - assets/images/
    - assets/images/directory_structure.json
  1. 读取JSON文件获取目录信息:
import 'package:flutter/services.dart';
import 'dart:convert';

Future<void> getImageDirectoryInfo() async {
  final jsonContent = await rootBundle.loadString('assets/images/directory_structure.json');
  final directoryData = json.decode(jsonContent);

  print('子文件夹列表:');
  for (var folder in directoryData['subfolders']) {
    print('- $folder');
  }

  print('\n文件列表:');
  for (var file in directoryData['files']) {
    print('- $file');
  }
}

关键注意事项

  • 禁止使用Directory或File类直接访问Flutter assets,这类API仅适用于设备文件系统中的真实路径
  • 所有需要访问的assets必须在pubspec.yaml中声明,否则无法通过rootBundle加载
  • 若使用通配符声明子目录,需确认Flutter版本支持该语法(通常Flutter 1.17+已支持)

内容的提问来源于stack exchange,提问作者StativBus

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 19:12:41