|
| 1 | +--- |
| 2 | +title: 'React Native 0.86 - Edge-to-Edge and DevTools Improvements, no breaking changes' |
| 3 | +authors: [fabriziocucci, zoontek, gabrieldonadel] |
| 4 | +tags: [announcement, release] |
| 5 | +date: 2026-06-10 |
| 6 | +--- |
| 7 | + |
| 8 | +# React Native 0.86 - Edge-to-Edge and DevTools Improvements, no breaking changes |
| 9 | + |
| 10 | +Today we are excited to release React Native 0.86! |
| 11 | + |
| 12 | +This release includes comprehensive edge-to-edge support on Android 15+ and performance tracing improvements in React Native DevTools. |
| 13 | + |
| 14 | +Following 0.83, this is the second React Native release with no user-facing breaking changes, reflecting our continued commitment to making upgrades more predictable and seamless. |
| 15 | + |
| 16 | +### Highlights |
| 17 | + |
| 18 | +- [Edge-to-Edge on Android](/blog/2026/06/10/react-native-0.86#edge-to-edge-on-android) |
| 19 | +- [React Native DevTools: Performance Tracing](/blog/2026/06/10/react-native-0.86#react-native-devtools-performance-tracing) |
| 20 | + |
| 21 | +{/* truncate */} |
| 22 | + |
| 23 | +## Highlights |
| 24 | + |
| 25 | +### Edge-to-Edge on Android |
| 26 | + |
| 27 | +React Native 0.86 ships comprehensive fixes for Android 15+ edge-to-edge mode, where the system enforces edge-to-edge display even when apps don't explicitly opt in. |
| 28 | + |
| 29 | +Key fixes include: |
| 30 | + |
| 31 | +- **`measureInWindow`** now returns correct coordinates when edge-to-edge is enabled. |
| 32 | +- **`KeyboardAvoidingView`** works correctly on Android 15+ with `edgeToEdgeEnabled`. |
| 33 | +- **`Dimensions`** window values are accurate on Android versions prior to 15 when edge-to-edge is enabled. |
| 34 | +- **`StatusBar`** now supports updating status bar style and visibility while a Modal is open. |
| 35 | +- **Navigation bar** contrast respects the theme's `enforceNavigationBarContrast` attribute. |
| 36 | + |
| 37 | +React Native now also handles edge-to-edge correctly when it's enforced by the OS (Android 15+) but not explicitly enabled via the `edgeToEdgeEnabled` Gradle property. |
| 38 | + |
| 39 | +### React Native DevTools: Performance Tracing |
| 40 | + |
| 41 | +React Native DevTools now support **light/dark mode emulation** via `Emulation.setEmulatedMedia`, allowing you to test your app's appearance mode handling directly from the DevTools without changing your device settings. |
| 42 | + |
| 43 | +## Breaking Changes |
| 44 | + |
| 45 | +React Native 0.86 has **no user-facing breaking changes**. |
| 46 | + |
| 47 | +If you are on React Native 0.85, you should be able to upgrade your app to React Native 0.86 without any changes to your app code. |
| 48 | + |
| 49 | +To learn more about what we consider a breaking change, have a look at [this article](/docs/releases/versioning-policy#what-is-a-breaking-change). |
| 50 | + |
| 51 | +## Deprecations |
| 52 | + |
| 53 | +The following APIs have been removed and are due for removal in a future release of React Native: |
| 54 | + |
| 55 | +- **`ViewUtil.getUIManagerType`**: As part of the removal of the legacy architecture, this API is now deprecated. You can inline `UIManagerType.Fabric` directly or remove the checks on the UIManagerType altogether. |
| 56 | +- **`AppRegistry`**: The second argument of `AppRegistry.setComponentProviderInstrumentationHook` is now deprecated and will warn if used. |
| 57 | + |
| 58 | +## Other Changes |
| 59 | + |
| 60 | +### Runtime & Web Spec Alignment |
| 61 | + |
| 62 | +- **`ExceptionsManager.reportErrorsAsExceptions` strictness**: Setting `reportErrorsAsExceptions` to anything other than `false` no longer does anything. Previously, any falsy value (like `0`, `null`, or `""`) would disable error-to-exception conversion. Now only the explicit boolean `false` opts out, making the API less error-prone. |
| 63 | +- **`PerformanceObserver` default `durationThreshold`**: `observe({type: 'event'})` now correctly defaults `durationThreshold` to 104ms per the W3C Event Timing spec, instead of reporting all events. This aligns React Native's Performance API with web standards and reduces noise from very short events. |
| 64 | + |
| 65 | +### Rendering, Layout & Animation |
| 66 | + |
| 67 | +- **Modal Components `style` prop**: The `style` prop is now forwarded to Modal's inner container View, allowing custom styling (e.g., padding, background colors) without overriding `transparent` or `backdropColor` behavior. |
| 68 | +- **Animated mounting layer sync**: Enabled a mounting layer synchronization so Native Animated synchronous updates are not overridden by later React commits. This fixes a flicker where animated views could briefly jump back to their pre-animation values. |
| 69 | +- **Text measurement crash**: Fixed a crash when measuring text on a surface that had already been stopped. |
| 70 | +- **Non-invertible transform touch fix**: Views with non-invertible transforms (e.g., `scaleX: 0` or `scaleY: 0`) no longer receive touches on Android or iOS. Hit-testing now detects when a transform matrix can't be inverted and skips those views. |
| 71 | +- **Yoga Layout fixes**: Fixed several layout regressions related to Yoga such as text wrapping in absolutely positioned elements on Android ([#56651](https://github.com/facebook/react-native/pull/56651)), a crash with Android's `BoringLayout.isBoring()` with a negative width ([#56007](https://github.com/facebook/react-native/pull/56007)) and fixed ownership of nodes with `display: contents` nodes ([#56422](https://github.com/facebook/react-native/pull/56422)). |
| 72 | + |
| 73 | +### Accessibility |
| 74 | + |
| 75 | +- **Unresolved promises**: Fixed `AccessibilityInfo.isDarkerSystemColorsEnabled`, `isHighTextContrastEnabled` and `prefersCrossFadeTransitions` returning promises that never resolved on unsupported platforms. They now resolve to `false` instead of hanging indefinitely. |
| 76 | + |
| 77 | +### Infrastructure & Dependencies |
| 78 | + |
| 79 | +- **Metro `^0.84.2`**: Updated Metro bundler dependency. |
| 80 | +- **`HeadlessJsTaskSupportModule` auto-registration**: This module is now registered in the `CoreReactPackage`, so apps that use headless JS tasks on Android no longer need to ensure this module is manually registered. |
| 81 | + |
| 82 | +### JSI (Native Interface) |
| 83 | + |
| 84 | +New JSI APIs added to make the C++ interface between native modules and the JS engine more capable: |
| 85 | + |
| 86 | +- **`IRuntime` interface**: Makes previously protected `Runtime` methods public, enabling new JSI functionality without cascading interface versions. |
| 87 | +- **`TypedArray` / `Uint8Array`**: First-class support for typed arrays, including creation, buffer access, offset and length queries. |
| 88 | +- **`ArrayBuffer.detached`**: Check whether an `ArrayBuffer` has been detached. |
| 89 | +- **`Array.push`**: Append elements to arrays (previously array size was immutable after creation). |
| 90 | +- **`String.length`**: Get string length in UTF-16 code units without converting to a full string. |
| 91 | +- **`isInteger`**: Check if a `jsi::Value` is an integer without calling into the runtime. |
| 92 | +- **Error creation APIs**: Factory methods for all standard JS error types (`TypeError`, `RangeError`, `ReferenceError`, `SyntaxError`, `EvalError`, `URIError`). |
| 93 | + |
| 94 | +### Android Input & Navigation |
| 95 | + |
| 96 | +- **BackHandler event object**: `hardwareBackPress` events now pass an event object with a `timeStamp` property from the native event, enabling timing analysis and event correlation. Existing callbacks that ignore the argument are unaffected. |
| 97 | +- **BackHandler resume fix on API 36+**: `BackHandler` callbacks stopped working after the app was resumed from the background on Android API 36+. The fix ensures the back button handler is properly re-registered during `onHostResume`. |
| 98 | +- **LogBox/RedBox back button dismiss**: LogBox notification toasts and the inspector overlay can now be dismissed via the Android hardware back button. |
| 99 | +- **TextInput `setAutoCapitalize` Samsung fix**: Fixed `setAutoCapitalize` stripping `TYPE_NUMBER_FLAG_SIGNED` and `TYPE_NUMBER_FLAG_DECIMAL` flags on Samsung keyboards, which prevented users from typing minus signs in numeric inputs. |
| 100 | +- **TextInput/KeyboardAvoidingView IME height**: `KeyboardAvoidingView` and TextInput auto-scroll now respond correctly to IME height changes, such as toggling between the keyboard and emoji panel or when the predictive text bar appears. |
| 101 | + |
| 102 | +### Android Networking |
| 103 | + |
| 104 | +- **`OutOfMemoryError` handling**: `NetworkingModule` now correctly handles very large HTTP responses and will not OOM or crash. |
| 105 | +- **WebSocket `Cookie` header**: `WebSocketModule` no longer strips a `Cookie` header passed via the WebSocket constructor's `headers` option, allowing authentication cookies to be sent over WebSocket connections. |
| 106 | +- **Blob content provider with New Architecture**: The Blob content provider (used for `blob:` URLs to access binary data) now works correctly with the New Architecture. |
| 107 | + |
| 108 | +## Acknowledgements |
| 109 | + |
| 110 | +React Native 0.86 contains over 596 commits from 97 contributors. Thanks for all your hard work! |
| 111 | + |
| 112 | +{/* alex ignore special white */} |
| 113 | + |
| 114 | +We want to send a special thank you to those community members that shipped significant contributions in this release. |
| 115 | + |
| 116 | +- [Mathieu Acthernoene](https://github.com/zoontek) for edge-to-edge support on Android and StatusBar improvements |
| 117 | +- [Rubén Norte](https://github.com/rubennorte) for React Native DevTools performance tracing |
| 118 | +- [Jakub Piasecki](https://github.com/j-piasecki) for ShadowTree and Yoga fixes |
| 119 | +- [Nick Gerleman](https://github.com/NickGerleman) for Text rendering fixes |
| 120 | +- [Peter Abbondanzo](https://github.com/Abbondanzo) for LogBox, ScrollView and Image fixes |
| 121 | + |
| 122 | +Moreover, we also want to thank the additional authors that worked on documenting features in this release post: |
| 123 | + |
| 124 | +{/* TODO: Add blog post co-authors */} |
| 125 | + |
| 126 | +## Upgrade to 0.86 |
| 127 | + |
| 128 | +:::info |
| 129 | + |
| 130 | +0.86 is now the latest stable version of React Native and 0.83.x moves to unsupported. For more information see [React Native's support policy](https://github.com/reactwg/react-native-releases/blob/main/docs/support.md). |
| 131 | + |
| 132 | +::: |
| 133 | + |
| 134 | +#### Upgrading |
| 135 | + |
| 136 | +Please use the [React Native Upgrade Helper](https://react-native-community.github.io/upgrade-helper/) to view code changes between React Native versions for existing projects, in addition to the [Upgrading docs](/docs/upgrading). |
| 137 | + |
| 138 | +#### Create a new project |
| 139 | + |
| 140 | +```sh |
| 141 | +npx @react-native-community/cli@latest init MyProject --version latest |
| 142 | +``` |
| 143 | + |
| 144 | +#### Expo |
| 145 | + |
| 146 | +For Expo projects, React Native 0.86 will be available as part of the `expo@canary` releases. |
0 commit comments