From ad312e4683f7ea88f043d98c03c74dedeb8521de Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Yusuf=20=C4=B0hsan=20G=C3=B6rgel?= Date: Sat, 18 Jul 2026 17:34:42 +0300 Subject: [PATCH] [google_fonts] Remove failed loads from pendingFonts --- packages/google_fonts/CHANGELOG.md | 4 ++++ .../google_fonts/lib/src/google_fonts_base.dart | 6 +++--- packages/google_fonts/pubspec.yaml | 2 +- .../test/load_font_if_necessary_test.dart | 15 +++++++++++++++ 4 files changed, 23 insertions(+), 4 deletions(-) diff --git a/packages/google_fonts/CHANGELOG.md b/packages/google_fonts/CHANGELOG.md index 738cbb1fff5b..99a7d557fa8e 100644 --- a/packages/google_fonts/CHANGELOG.md +++ b/packages/google_fonts/CHANGELOG.md @@ -1,3 +1,7 @@ +## 8.2.1 + +- Fixes `pendingFonts()` retaining failed font loads. + ## 8.2.0 - Extract the class `Config` to its own file and rename it `GoogleFontsConfig`. The `Config` class is now deprecated. diff --git a/packages/google_fonts/lib/src/google_fonts_base.dart b/packages/google_fonts/lib/src/google_fonts_base.dart index a2a403f9f5f2..b68795340514 100755 --- a/packages/google_fonts/lib/src/google_fonts_base.dart +++ b/packages/google_fonts/lib/src/google_fonts_base.dart @@ -28,8 +28,8 @@ void clearCache() => _loadedFonts.clear(); /// Set of [Future]s corresponding to fonts that are loading. /// -/// When a font is loading, a future is added to this set. When it is loaded in -/// the [FontLoader], that future is removed from this set. +/// When a font is loading, a future is added to this set. When the load +/// completes, whether successfully or with an error, that future is removed. final Set> pendingFontFutures = >{}; /// Default client used to fetch fonts when one is not supplied. @@ -106,7 +106,7 @@ TextStyle googleFontsTextStyle({ final Future loadingFuture = loadFontIfNecessary(descriptor); pendingFontFutures.add(loadingFuture); - loadingFuture.then((_) => pendingFontFutures.remove(loadingFuture)); + loadingFuture.whenComplete(() => pendingFontFutures.remove(loadingFuture)).ignore(); return textStyle.copyWith( fontFamily: familyWithVariant.toString(), diff --git a/packages/google_fonts/pubspec.yaml b/packages/google_fonts/pubspec.yaml index 0889deb4621f..54982f2b1b89 100644 --- a/packages/google_fonts/pubspec.yaml +++ b/packages/google_fonts/pubspec.yaml @@ -2,7 +2,7 @@ name: google_fonts description: A Flutter package to use fonts from fonts.google.com. Supports HTTP fetching, caching, and asset bundling. repository: https://github.com/flutter/packages/tree/main/packages/google_fonts issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+google_fonts%22 -version: 8.2.0 +version: 8.2.1 environment: sdk: ^3.10.0 diff --git a/packages/google_fonts/test/load_font_if_necessary_test.dart b/packages/google_fonts/test/load_font_if_necessary_test.dart index e4e57a05273f..ec7b54c1284b 100644 --- a/packages/google_fonts/test/load_font_if_necessary_test.dart +++ b/packages/google_fonts/test/load_font_if_necessary_test.dart @@ -88,6 +88,10 @@ final GoogleFontsDescriptor fakeDescriptor = GoogleFontsDescriptor( file: _fakeResponseFile, ); +final Map _fakeFonts = { + fakeDescriptor.familyWithVariant.googleFontsVariant: fakeDescriptor.file, +}; + // Same family & variant, different file. final GoogleFontsDescriptor fakeDescriptorDifferentFile = GoogleFontsDescriptor( familyWithVariant: fakeDescriptor.familyWithVariant, @@ -361,4 +365,15 @@ void main() { returnsNormally, ); }); + + test('pendingFonts removes failed font loads', () async { + when(mockHttpClient.gets(any)).thenAnswer((_) async { + return http.Response('', 404); + }); + + googleFontsTextStyle(fontFamily: fakeDescriptor.familyWithVariant.family, fonts: _fakeFonts); + + await expectLater(GoogleFonts.pendingFonts(), throwsException); + expect(await GoogleFonts.pendingFonts(), isEmpty); + }); }