diff --git a/packages/flutter_tools/lib/src/flutter_manifest.dart b/packages/flutter_tools/lib/src/flutter_manifest.dart index 9c2bcf4bd0e..b1100ab2a6b 100644 --- a/packages/flutter_tools/lib/src/flutter_manifest.dart +++ b/packages/flutter_tools/lib/src/flutter_manifest.dart @@ -404,7 +404,12 @@ void _validateFonts(YamlList fonts, List errors) { const Set fontWeights = { 100, 200, 300, 400, 500, 600, 700, 800, 900, }; - for (final YamlMap fontMap in fonts) { + for (final dynamic fontListEntry in fonts) { + if (fontListEntry is! YamlMap) { + errors.add('Unexpected child "$fontListEntry" found under "fonts". Expected a map.'); + continue; + } + final YamlMap fontMap = fontListEntry; for (dynamic key in fontMap.keys.where((dynamic key) => key != 'family' && key != 'fonts')) { errors.add('Unexpected child "$key" found under "fonts".'); } 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 231a2b8872e..79b16644e89 100644 --- a/packages/flutter_tools/test/general.shard/flutter_manifest_test.dart +++ b/packages/flutter_tools/test/general.shard/flutter_manifest_test.dart @@ -518,6 +518,26 @@ flutter: expect(flutterManifest, null); expect(logger.errorText, contains('Expected "fonts" to either be null or a list.')); }); + + testUsingContext('Returns proper error when second font family is invalid', () async { + final BufferLogger logger = context.get(); + const String manifest = ''' +name: test +dependencies: + flutter: + sdk: flutter +flutter: + uses-material-design: true + fonts: + - family: foo + fonts: + - asset: a/bar + - string +'''; + final FlutterManifest flutterManifest = FlutterManifest.createFromString(manifest); + expect(flutterManifest, null); + expect(logger.errorText, contains('Expected a map.')); + }); }); group('FlutterManifest with MemoryFileSystem', () {