diff --git a/packages/flutter_tools/lib/src/flutter_manifest.dart b/packages/flutter_tools/lib/src/flutter_manifest.dart index 5334b5b1d6f..759734ce266 100644 --- a/packages/flutter_tools/lib/src/flutter_manifest.dart +++ b/packages/flutter_tools/lib/src/flutter_manifest.dart @@ -439,8 +439,13 @@ void _validateFonts(YamlList fonts, List errors) { errors.add('Expected "fonts" to either be null or a list.'); continue; } - for (final YamlMap fontListItem in fontMap['fonts']) { - for (final MapEntry kvp in fontListItem.entries) { + for (final dynamic fontListItem in fontMap['fonts']) { + if (fontListItem is! YamlMap) { + errors.add('Expected "fonts" to be a list of maps.'); + continue; + } + final YamlMap fontMapList = fontListItem; + for (final MapEntry kvp in fontMapList.entries) { if (kvp.key is! String) { errors.add('Expected "${kvp.key}" under "fonts" to be a string.'); } diff --git a/packages/flutter_tools/test/general.shard/flutter_manifest_test.dart b/packages/flutter_tools/test/general.shard/flutter_manifest_test.dart index 7f0d34731be..cfdc70fe9cd 100644 --- a/packages/flutter_tools/test/general.shard/flutter_manifest_test.dart +++ b/packages/flutter_tools/test/general.shard/flutter_manifest_test.dart @@ -534,6 +534,25 @@ flutter: expect(logger.errorText, contains('Expected "fonts" to either be null or a list.')); }); + testUsingContext('Returns proper error when font detail is not a list of maps', () async { + final BufferLogger logger = context.get(); + const String manifest = ''' +name: test +dependencies: + flutter: + sdk: flutter +flutter: + fonts: + - family: foo + fonts: + - asset +'''; + final FlutterManifest flutterManifest = FlutterManifest.createFromString(manifest); + + expect(flutterManifest, null); + expect(logger.errorText, contains('Expected "fonts" to be a list of maps.')); + }); + testUsingContext('Returns proper error when font is a map instead of a list', () async { final BufferLogger logger = context.get(); const String manifest = '''