◉RORK LABJP
●GPT6.1 — GPT-6.1 Sol joined Rork's model menu on Sep 29. It costs the same as GPT-6 Sol and reads a 1M-token context●SDK58 — Expo SDK 58 Beta is out, bundling a React Native 0.88 release candidate. A stable date has not been confirmed yet●10/12 — 5 days until the planned React Native 0.88.x release. The Expo Go update that follows drops SDK 57 support●TESTFLIGHT — A Zenn post covers putting an iPhone app on TestFlight with no Mac, Windows only, and the four places it snagged●NEW — I picked between Sonnet 5.5, GPT-6.1 Sol and Opus 5.5 by the kind of fix, and logged where my credits went for a week●EXPO — As Shopify moves back to native, a Zenn post explains staying on Expo as a solo developer. The one person who verifies is the real point●GPT6.1 — GPT-6.1 Sol joined Rork's model menu on Sep 29. It costs the same as GPT-6 Sol and reads a 1M-token context●SDK58 — Expo SDK 58 Beta is out, bundling a React Native 0.88 release candidate. A stable date has not been confirmed yet●10/12 — 5 days until the planned React Native 0.88.x release. The Expo Go update that follows drops SDK 57 support●TESTFLIGHT — A Zenn post covers putting an iPhone app on TestFlight with no Mac, Windows only, and the four places it snagged●NEW — I picked between Sonnet 5.5, GPT-6.1 Sol and Opus 5.5 by the kind of fix, and logged where my credits went for a week●EXPO — As Shopify moves back to native, a Zenn post explains staying on Expo as a solo developer. The one person who verifies is the real point
Articles/Dev Tools
⬡ Dev Tools/2026-08-23Advanced

Predictive back on Android 16: what to fix before August 31, and what can wait

Targeting API 36 turns predictive back on by default and stops onBackPressed from firing. Here is how I split the work that the deadline actually requires from the work that does not, and how I kept the opt-out from disappearing on the next prebuild.

Android 164predictive backExpo213React Native238config plugin6

✦ Premium Article

After bumping targetSdkVersion to 36, the preview screen looked different when I swiped in from the edge. The screen shrank slightly and revealed what was behind it. That is Android's predictive back animation.

That part I expected. What stopped me was what came next. A swipe I meant as "go back to the grid" was being treated as "leave the app."

The React Native announcement says BackHandler keeps working. And it did keep working. Yet the outcome of the back gesture had changed. It took me a while to understand how both of those can be true at the same time.

"BackHandler still works" and "back navigation is unchanged" are different claims

Apps targeting Android 16 get predictive back enabled by default. Two things change at the OS level.

Before (targetSdk 35 and below)targetSdk 36
onBackPressed() is calledNot called
KeyEvent.KEYCODE_BACK is dispatchedNot dispatched

React Native 0.81 absorbed that change so the JS-side BackHandler keeps firing. The community announcement states that onBackPressed is no longer called, that BackHandler should continue to work, and that if you have custom native back handling you may need to migrate it by hand to OnBackPressedDispatcher.

What I misread was the scope of "BackHandler still works." What keeps working is the handler you registered yourself on hardwareBackPress. Screens where you did not register anything — the ones that hand back navigation to your navigation library — are not covered by that promise.

And React Navigation has not caught up with predictive back yet. Its documentation currently tells you to set android:enableOnBackInvokedCallback to false so the system back gesture behaves as expected. On the Expo side there are reports of stack back navigation breaking under predictive back, with work happening in the newer native stack in react-native-screens.

So the thing that breaks is not the BackHandler you wrote. It is the code you never wrote. That was the most counterintuitive part of this for me: rereading my own source gives you no reason for the failure.

What the opt-out flag stops, and what it does not

android:enableOnBackInvokedCallback="false" is the temporary opt-out Google documents. Its effect is asymmetric in a way that matters for planning.

TargetWith the flag set to false
Predictive back system animationDisabled
OnBackInvokedCallbackIgnored
OnBackPressedCallbackStill called, regardless of the flag

OnBackPressedCallback fires either way. Anything handling back through the AndroidX APIs behaves the same with or without the opt-out. What the flag rolls back is the system animation and the newer callback path.

One more detail. The attribute can live on <application> or on <activity>, and the per-activity value wins. If you set false on <application> but an old true is still sitting on an <activity> from some past experiment, that one screen will not match the rest. I decided to catch that mechanically rather than by memory, which is why the script below inspects both elements.

✦

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
✦Decide with confidence that the August 31 deadline only requires the target SDK bump, and that full predictive-back support can be scheduled separately
✦Sort which of your apps can actually break on back navigation using a script, before you spend an evening tapping through screens on a device
✦Keep an opt-out from silently vanishing on the next prebuild, so a fix you already made does not quietly revert
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 $15 for lifetime access
View Membership →

Related Articles

⬡ Dev Tools2026-07-28
Counting what prebuild --clean will erase before you upgrade to Expo SDK 57
A raw diff between two generated ios/ trees showed 649 changed lines; only 3 were real edits. How to count what prebuild --clean erases, and move it into a config plugin.
⬡ Dev Tools2026-09-10
I Added a Dim Screen Button, and iPhones Stayed Dark After the App Was Closed
In expo-brightness, setBrightnessAsync applies only to the current activity on Android, but changes the device brightness itself on iOS. Here is why the cleanup burden falls on one platform only, and a hook that restores brightness through AppState.
⬡ Dev Tools2026-09-04
EAS secret visibility does not keep a value out of your app — deciding prefix and visibility separately
The EXPO_PUBLIC_ prefix decides what ships inside your app; EAS visibility decides who can read it. Why stacking them blanks a value on OTA updates, and how to check your build.
📚RECOMMENDED BOOKS
Build a Large Language Model (From Scratch)
Sebastian Raschka
LLM Dev
Prompt Engineering for LLMs
Berryman & Ziegler
Prompting
AI Engineering
Chip Huyen
AI Eng
* Contains affiliate links