◉RORK LABJP
●GPT-6.1 SOL — Added to Rork's model menu (09-29) with Low, Medium and High effort; included on Pro and Max●SONNET 5.5 — Claude Sonnet 5.5 is selectable: strong at UI design and faster than Sonnet 5 (09-28)●SONNET 4.5 — Retires on the Claude API on 11/30, 36 days left. If your app calls it, check the migration target●SDK 58 ISSUE — Early reports include Android widgets not refreshing on a schedule and Stripe linking statically●OBSERVE — EAS Observe now records native crashes too (SDK 57.0.21 or later, 10/07)●NEW — My App Open Ad Only Showed When the App…●GPT-6.1 SOL — Added to Rork's model menu (09-29) with Low, Medium and High effort; included on Pro and Max●SONNET 5.5 — Claude Sonnet 5.5 is selectable: strong at UI design and faster than Sonnet 5 (09-28)●SONNET 4.5 — Retires on the Claude API on 11/30, 36 days left. If your app calls it, check the migration target●SDK 58 ISSUE — Early reports include Android widgets not refreshing on a schedule and Stripe linking statically●OBSERVE — EAS Observe now records native crashes too (SDK 57.0.21 or later, 10/07)●NEW — My App Open Ad Only Showed When the App…
Articles/Dev Tools
⬡ Dev Tools/2026-10-25Intermediate

Fullscreen Ads Stopped Showing After Going Back and Forth Between Screens — The Ad Holder Was Still Holding a Closed Screen

Fullscreen ads vanished after reopening a screen because a reused ad holder kept notifying a closed screen. A holder that swaps only its listener target, tested in Node.

interstitial adsAdMob74lifecycleExpo Router7indie developer49troubleshooting78

✦ Premium Article

Open a wallpaper, go back, open another, go back. In a wallpaper app, screens are created and closed over and over while someone is using it.

Somewhere in that back-and-forth, fullscreen ads stopped appearing. The first screen I opened showed one. But once I went back and reopened a screen, the moment that should have shown an ad simply passed with nothing happening. No crash, no error message.

Reuse the ad object instead of recreating it, but swap who it notifies every time the screen changes. That one sentence is what the fix came down to.

This happened in a native wallpaper app that I run as an indie developer, but the same shape is easy to build in the Expo apps Rork exports. Below is the pattern rewritten in TypeScript and run on Node 22 to check it.

The only symptom was "it stops from the second time"

When a bug gives you little to go on, it helps to write the observations in a table and pin down what differs. For this kind of bug, they line up like this.

What you observeWhat it tells you
The first screen shows an adAd unit IDs and review status are fine, so the ad configuration is right
A screen reopened after going back does notThe problem is on the receiving side of "loaded", not the showing side
No error appears anywhereThis is not an SDK failure; notifications are going somewhere else
Quitting and relaunching the app brings back one adState lives somewhere long-lived at app level, not in the screen

Suspecting the ad settings first tends to be the long way around. If the settings are right and ads stop from the second time on, suspect who the notification is reaching.

What was happening: a first screen left inside a "don't recreate" design

If you create a fullscreen ad object per screen, loading starts over each time. So I kept one app-wide static holder and reused it. That part was a reasonable decision, I think.

The problem was that the holder also kept a reference to the first screen that used it. Even after that screen closed, the holder was still holding it. A new screen would ask for an ad and get the same object. But the "loaded" notification flew to the closed screen. The new screen stayed on "preparing" forever.

The fix was not to recreate the object. It was to keep the object and update only the reference to the current screen. Later, the same shape showed up in a rewarded-ad holder as well. Do not let a reused object hold a direct reference to a screen is now the first item on my checklist.

✦

Thank you for reading this far.

Continue Reading

What follows includes implementation code, benchmarks, and practical content we hope you'll find useful. This site runs without ads — server and development costs are supported entirely by members like you. If it's been helpful, we'd be truly grateful for your support.

WHAT YOU'LL LEARN
✦You can tell in a few minutes whether ads that stopped appearing after screen navigation are a settings problem or a notification-routing problem
✦You can reuse a fullscreen ad object without recreating it, swap only the listener target to the current screen, and unit-test that holder away from the ad SDK
✦You can head off the ordering trap where an old screen's cleanup wipes out the new screen's connection, before it ships
Secure payment via Stripe · Cancel anytime
✦

Unlock This Article

Get full access to the rest of this article. Buy once, read anytime. This site is ad-free — your support goes directly toward keeping it running.

or
Unlock all articles with Membership →
Share

Thank You for Reading

Rork Lab is ad-free, supported entirely by members like you. We publish practical guides daily with implementation code, benchmarks, and production-ready patterns. If you've found it useful, we'd love to have you on board.

  • ✦Copy-paste ready implementation code
  • ✦New advanced guides published daily
  • ✦$5/mo or $10 for lifetime access
View Membership →

Related Articles

⬡ Dev Tools2026-10-24
The ANR Was Coming From Cleanup When a Screen Closed: Classifying the Blocking Line From Traces
A Python script that reads Android ANR traces and classifies the line that blocked the main thread, such as billing client teardown or synchronous image decoding. Two causes I found in my wallpaper apps, and the thinking behind the fixes.
⬡ Dev Tools2026-10-25
Sound Effects Stop at Play #40 — With expo-audio's createAudioPlayer, remove() Alone Isn't Cleanup
Creating a createAudioPlayer instance per play in expo-audio can leave Android silent after about 40 plays, with didJustFinish never arriving. What remove() and release() each do, three ways to restructure, and how to notice when it happens.
⬡ Dev Tools2026-10-23
Failed to resolve plugin for module: Check the Spelling, the Install, the File, Then the Contents
You add one line to plugins in app.json and Expo stops with PluginError: Failed to resolve plugin for module. I reproduced the causes behind that one message in a blank Expo SDK 58 project and put them in the order I now check them, using a single command.