---
modificationDate: October 08, 2026
title: Hinge
description: A library that provides the device hinge angle and status on Android foldables and iPhone Duo.
sourceCodeUrl: 'https://github.com/expo/expo/tree/main/packages/expo-hinge'
packageName: 'expo-hinge'
platforms: ['android', 'ios']
isNew: true
---

This documentation is available as Markdown for AI agents and LLMs. See the [full Markdown index](https://docs.expo.dev/llms.txt) or append .md to any documentation URL.

> This is documentation for the next SDK version.

# Expo Hinge

A library that provides the device hinge angle and status on Android foldables and iPhone Duo.

<AgentInstructions>

## Submitting Feedback

If you encounter errors, misleading or outdated information, report it so Expo can be improved:

Preferred command:
npx --yes submit-expo-feedback@latest --category docs --subject "/versions/unversioned/sdk/hinge/" "<actionable feedback>"

Direct HTTP fallback:
curl -X POST https://api.expo.dev/v2/feedback/docs-send -H 'Content-Type: application/json' -d '{"url":"/versions/unversioned/sdk/hinge/","feedback":"🤖 Agent feedback for docs: <specific, actionable description> (<model>, <harness>)"}'

Only submit when you have something specific and actionable to report. Try to give the most context.

## Navigation

When answering a related or follow-up question, use llms.txt to find the relevant page as Markdown (.md) instead of guessing.

You are here: Reference (unversioned) > Expo SDK (90 pages in this section)
Full documentation tree: [llms.txt](https://docs.expo.dev/llms.txt)

</AgentInstructions>
Android, iOS

`expo-hinge` exposes the hinge of a foldable device, such as an Android foldable or iPhone Duo, to the whole app. It reports the angle in degrees and whether the hinge is closed, partially open, or fully open. On Android, the hinge angle sensor provides the angle and Jetpack WindowManager's [`FoldingFeature`](https://developer.android.com/reference/androidx/window/layout/FoldingFeature) provides the status. On iOS, a [`UIHingeInteraction`](https://developer.apple.com/documentation/uikit/uihingeinteraction) on the app's window provides these values. For reacting to the hinge from one SwiftUI view, use the [`onHingeChange`](https://docs.expo.dev/versions/unversioned/sdk/ui/swift-ui/modifiers.md#onhingechangehandler) modifier from `@expo/ui` instead.

> On Android, hinge updates need Android 11 (API level 30) or later. On iOS, they need iOS 27.1 or later and a build made with Xcode 27.1 or later. On older builds and systems, and on devices without a hinge, the hinge is `null`. Use hinge state for interactions and effects, not for layout.

## Status on Android

Android has no public API that reports a closed hinge, so the status is never `closed` on Android. Android reports the hinge state only while the app's window spans the fold. Otherwise, such as on the outer screen of a closed device, the status is `unknown`, but Android still reports the angle. To detect a closed device on Android, check for an angle near `0`. Choose a threshold that suits your app, because device makers define their own ranges.

## Installation

```sh
# npm
npx expo install expo-hinge

# yarn
yarn expo install expo-hinge

# pnpm
pnpm expo install expo-hinge

# bun
bun expo install expo-hinge
```

If you are installing this in an [existing React Native app](https://docs.expo.dev/bare/overview.md), make sure to [install `expo`](https://docs.expo.dev/bare/installing-expo-modules.md) in your project.

## Usage

```tsx
import { useHinge } from 'expo-hinge';
import { StyleSheet, Text, View } from 'react-native';

export default function App() {
  const hinge = useHinge();

  return (
    <View style={styles.container}>
      <Text>{hinge ? `${hinge.status} at ${Math.round(hinge.angle)}°` : 'No hinge'}</Text>
    </View>
  );
}

const styles = StyleSheet.create({
  container: {
    flex: 1,
    alignItems: 'center',
    justifyContent: 'center',
  },
});
```

## API

```ts
import * as Hinge from 'expo-hinge';
```

## Hooks

### `useHinge()`

Supported platforms: Android, iOS.

Returns the live hinge state and re-renders on every change. The first render already has the current value, since the native module caches it.

Returns: `Hinge | null`

Example

```tsx
const hinge = useHinge();
return <Text>{hinge ? `${hinge.status} at ${hinge.angle}°` : 'No hinge'}</Text>;
```

## Methods

### `getHinge()`

Supported platforms: Android, iOS.

Returns the current hinge state synchronously, or `null` when the API is unavailable, the device has no hinge, or the app's window provides no hinge updates.

Returns: `Hinge | null`

Example

```ts
Hinge.getHinge();
// { angle: 120, status: 'partiallyOpen' }
```

### `isAvailable()`

Supported platforms: Android, iOS.

Returns whether this build and OS can report the hinge: Android 11 (API level 30) or later, or iOS 27.1 or later, built with the iOS 27.1 SDK. It does not mean the device has a hinge, which [`getHinge()`](https://docs.expo.dev/versions/unversioned/sdk/hinge.md#gethinge) answers with a non-`null` value. Always `false` on web.

Returns: `boolean`

## Event subscriptions

### `addHingeListener(listener)`

Supported platforms: Android, iOS.

| Parameter | Type | Description |
| --- | --- | --- |
| `listener` | (event: [HingeChangeEvent](https://docs.expo.dev/versions/unversioned/sdk/hinge.md#hingechangeevent)) => void | A callback that is invoked with a [`HingeChangeEvent`](https://docs.expo.dev/versions/unversioned/sdk/hinge.md#hingechangeevent). |

  

Subscribes to hinge changes. The listener is called on every angle or status change, and with a `null` hinge when the window stops providing hinge updates. Use hinge state for interactions and effects, not for layout.

Returns: `EventSubscription`

An `EventSubscription` whose `remove()` unsubscribes the listener.

## Types

### `ExpoHingeModuleEvents`

Supported platforms: Android, iOS.

| Property | Type | Description |
| --- | --- | --- |
| hingeChange | (event: [HingeChangeEvent](https://docs.expo.dev/versions/unversioned/sdk/hinge.md#hingechangeevent)) => void | - |

### `Hinge`

Supported platforms: Android, iOS.

State of the device hinge.

| Property | Type | Description |
| --- | --- | --- |
| angle | `number` | The current angle of the hinge in degrees, where `0` is closed and `180` is flat. The rate and granularity of angle updates are system policy, so do not depend on a particular update frequency or precision. Prefer `status` when you only need to know whether the hinge is closed, partially open, or fully open, except on Android, where `status` is never `closed`. On Android, the angle comes from the hinge angle sensor. |
| status | [HingeStatus](https://docs.expo.dev/versions/unversioned/sdk/hinge.md#hingestatus) | The current status of the hinge, determined by the system from the angle and device orientation. |

### `HingeChangeEvent`

Supported platforms: Android, iOS.

| Property | Type | Description |
| --- | --- | --- |
| hinge | [Hinge](https://docs.expo.dev/versions/unversioned/sdk/hinge.md#hinge) | null | The current hinge, or `null` when the device has no hinge, the app's window provides no hinge updates, or, on Android, the device has no hinge angle sensor. |

### `HingeStatus`

Supported platforms: Android, iOS.

Literal type: `string`

Status of the device hinge, as reported by the state of Jetpack WindowManager's `FoldingFeature` on Android and by UIKit's `UIHinge.Status` on iOS. Android has no public API for a closed hinge, so it never reports `closed`. It reports `unknown` while the app's window does not span the fold, such as on the outer screen of a closed device. To detect a closed device on Android, check for an `angle` near `0` with a threshold that suits your app.

Acceptable values are: `'closed'` | `'partiallyOpen'` | `'fullyOpen'` | `'unknown'`
