Skip to content

Commit 50b2a37

Browse files
committed
fix(ads): prevent ad loader widget crashes on null ads or errors
- Complete Future normally instead of with error when no ad is returned or an error occurs - This change prevents crashes in news/expresso when an ad is not returned - Affected methods: - _InArticleAdLoaderWidgetState._loadAd - _InArticleAdLoaderWidgetState.dispose - _InArticleAdLoaderWidgetState._onAdFailedToLoad - _InArticleAdLoaderWidgetState._cacheKey - Fixes EXPOSURE-2542
1 parent 09b9285 commit 50b2a37

File tree

1 file changed

+8
-12
lines changed

1 file changed

+8
-12
lines changed

lib/ads/widgets/in_article_ad_loader_widget.dart

Lines changed: 8 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -90,9 +90,7 @@ class _InArticleAdLoaderWidgetState extends State<InArticleAdLoaderWidget> {
9090
_adCacheService.removeAndDisposeAd(oldCacheKey);
9191

9292
if (_loadAdCompleter != null && !_loadAdCompleter!.isCompleted) {
93-
_loadAdCompleter?.completeError(
94-
StateError('Ad loading cancelled: Widget updated with new config.'),
95-
);
93+
_loadAdCompleter!.complete(); // Complete normally to prevent crashes
9694
}
9795
_loadAdCompleter = null;
9896

@@ -112,9 +110,7 @@ class _InArticleAdLoaderWidgetState extends State<InArticleAdLoaderWidget> {
112110
_adCacheService.removeAndDisposeAd(cacheKey);
113111

114112
if (_loadAdCompleter != null && !_loadAdCompleter!.isCompleted) {
115-
_loadAdCompleter?.completeError(
116-
StateError('Ad loading cancelled: Widget disposed.'),
117-
);
113+
_loadAdCompleter!.complete(); // Complete normally to prevent crashes
118114
}
119115
_loadAdCompleter = null;
120116
super.dispose();
@@ -185,11 +181,10 @@ class _InArticleAdLoaderWidgetState extends State<InArticleAdLoaderWidget> {
185181
_hasError = true;
186182
_isLoading = false;
187183
});
188-
// Complete the completer with an error only if it hasn't been completed already.
184+
// Complete the completer normally, indicating that loading finished
185+
// but no ad was available. This prevents crashes.
189186
if (_loadAdCompleter?.isCompleted == false) {
190-
_loadAdCompleter?.completeError(
191-
StateError('Failed to load in-article ad: No ad returned.'),
192-
);
187+
_loadAdCompleter!.complete();
193188
}
194189
}
195190
} catch (e, s) {
@@ -203,9 +198,10 @@ class _InArticleAdLoaderWidgetState extends State<InArticleAdLoaderWidget> {
203198
_hasError = true;
204199
_isLoading = false;
205200
});
206-
// Complete the completer with an error only if it hasn't been completed already.
201+
// Complete the completer normally, indicating that loading finished
202+
// but an error occurred. This prevents crashes.
207203
if (_loadAdCompleter?.isCompleted == false) {
208-
_loadAdCompleter?.completeError(e);
204+
_loadAdCompleter!.complete();
209205
}
210206
}
211207
}

0 commit comments

Comments
 (0)