diff --git a/packages/flutter_tools/lib/src/asset.dart b/packages/flutter_tools/lib/src/asset.dart index 17b728cd028..61bee0e7760 100644 --- a/packages/flutter_tools/lib/src/asset.dart +++ b/packages/flutter_tools/lib/src/asset.dart @@ -1019,6 +1019,7 @@ class _AssetDirectoryCache { final FileSystem _fileSystem; final Map> _cache = >{}; + final Map> _variantsPerFolder = >{}; List variantsFor(String assetPath) { final String directory = _fileSystem.path.dirname(assetPath); @@ -1030,25 +1031,26 @@ class _AssetDirectoryCache { if (_cache.containsKey(assetPath)) { return _cache[assetPath]!; } - - final List entitiesInDirectory = _fileSystem.directory(directory).listSync(); - - final File assetFile = _fileSystem.file(assetPath); - final List pathsOfVariants = [ - // It's possible that the user specifies only explicit variants (e.g. .../1x/asset.png), - // so there does not necessarily need to be a file at the given path. - if (assetFile.existsSync()) - assetPath, - ...entitiesInDirectory + if (!_variantsPerFolder.containsKey(directory)) { + _variantsPerFolder[directory] = _fileSystem.directory(directory) + .listSync() .whereType() .where((Directory dir) => _assetVariantDirectoryRegExp.hasMatch(dir.basename)) .expand((Directory dir) => dir.listSync()) .whereType() - .where((File file) => file.basename == assetFile.basename) + .toList(); + } + final File assetFile = _fileSystem.file(assetPath); + final List potentialVariants = _variantsPerFolder[directory]!; + final String basename = assetFile.basename; + return _cache[assetPath] = [ + // It's possible that the user specifies only explicit variants (e.g. .../1x/asset.png), + // so there does not necessarily need to be a file at the given path. + if (assetFile.existsSync()) + assetPath, + ...potentialVariants + .where((File file) => file.basename == basename) .map((File file) => file.path), ]; - - _cache[assetPath] = pathsOfVariants; - return pathsOfVariants; } } diff --git a/packages/flutter_tools/test/general.shard/asset_bundle_test.dart b/packages/flutter_tools/test/general.shard/asset_bundle_test.dart index e2cd837832b..ff4e3dcba27 100644 --- a/packages/flutter_tools/test/general.shard/asset_bundle_test.dart +++ b/packages/flutter_tools/test/general.shard/asset_bundle_test.dart @@ -4,7 +4,6 @@ import 'dart:convert'; -import 'package:file/file.dart'; import 'package:file/memory.dart'; import 'package:flutter_tools/src/artifacts.dart'; import 'package:flutter_tools/src/asset.dart';