True Sheet
Set up True Sheet for bottom sheet in an Expo app with ReadyNative: native iOS and Android bottom sheets with snap points · dev build required (no Expo Go)
Expo Go: no - dev build required
Ships native code. Make a dev build with bunx expo run:ios / bunx expo run:android (or bunx eas-cli build --profile development).
Product page: what this module adds to ReadyNative
This gives you a native bottom sheet on iOS and Android through @lodev09/react-native-true-sheet: a panel that slides up with snap points, a grabber and swipe-to-dismiss, drawn by UIKit on iOS and by Material on Android. You open it from code with sheet.current?.present() and close it with dismiss(). The module adds one example, /examples/sheet: a button that opens a sheet with a short text and a Close button. The core tree never imports the library; only the example route and its screen do.
Setup
bun run setup --sheet true-sheet- Make a dev build:
npx expo run:ios(ornpx expo run:android, oreas build --profile development). True Sheet is a native module, so Expo Go can't load it. - On iOS, build with Xcode 26.1 or newer, which the library requires.
- Open
/examples/sheetin the dev build and present the sheet. - Run
bun run doctor- the dev build row for this module should be green.
The module installs @lodev09/react-native-true-sheet with npx expo install. The library has no config plugin, so nothing goes into app.config.ts.
Usage
import { TrueSheet } from "@lodev09/react-native-true-sheet";
import { useRef } from "react";
import { Box, Button, Text } from "@/ui";
export function Demo() {
const sheet = useRef<TrueSheet>(null);
return (
<>
<Button onPress={() => void sheet.current?.present()}>Open</Button>
<TrueSheet ref={sheet} detents={["auto", 1]} cornerRadius={24}>
<Box gap={4} p={5}>
<Text variant="heading">Details</Text>
<Button variant="outline" onPress={() => void sheet.current?.dismiss()}>
Close
</Button>
</Box>
</TrueSheet>
</>
);
}detents are the heights the sheet rests at, smallest first: "auto" fits the content, "peek" rests at the collapsed height of the header and footer, and a number from 0 to 1 is a fraction of the available height. present(index) opens it at a detent, resize(index) moves it to another one, and dismiss() closes it together with any sheet presented on top. cornerRadius sets the corner radius; leave it out for the system default.
Gotchas
- Dev build only. Expo Go can't load the native module, and the package throws at import when it is missing, so reach the sheet only in a dev build.
- At most three detents: collapsed, half-expanded and expanded. Sort them from smallest to largest, and put
"auto"first when the content changes. "auto"needs iOS 16 or newer; on older iOS use fixed fractions.- Jest:
__mocks__/@lodev09/react-native-true-sheet.tsxstands in for the package in every test. It renders the children and recordspresent,dismissandresizeasjest.fns, which the example's test reads withjest.requireMock. The library also ships its own mock at@lodev09/react-native-true-sheet/mockif you want that one instead. - The example route is one of the examples that
bun run cleanremoves; the library and the sheet you build stay, so you can open a sheet from any screen.
Remove it
While modules/ exists (a tree set up with --keep-modules), setup does all of it:
bun run setup --sheet none --yes --keep-modulesIn a finalized tree setup is a stub, so you undo it by hand. Here is everything this module added:
- Delete the files that are still there (the demo screens are gone already unless you set up with
--with-examples):__mocks__/@lodev09/react-native-true-sheet.tsx,src/app/examples/sheet.tsx,src/screens/examples/__tests__/sheet-example-screen.test.tsx,src/screens/examples/sheet-example-screen.tsx. - Uninstall the dependencies:
bun remove @lodev09/react-native-true-sheet. - Check it:
bun run typecheckandbun run lintpoint at anything that still imports the removed files;bun run gen:graphrefreshesdocs/ARCHITECTURE.md.
Reference
Everything below is generated from modules/sheet/true-sheet/module.json - the same file bun run setup reads, so it is what actually lands in your repo.
Install
bun run setup --sheet true-sheetModule id: sheet/true-sheet (the default for this category).
Dependencies
| Package | Version | Kind |
|---|---|---|
@lodev09/react-native-true-sheet | ^4.1.0 | dependency (expo install) |
Doctor checks
- dev build toolchain (Xcode / Android SDK)
After setup
- Make a dev build with
npx expo run:ios/npx expo run:android(oreas build --profile development). True Sheet is a native module with no config plugin: Expo Go cannot load it, and the package throws at import when the native module is missing. - The iOS build needs Xcode 26.1 or newer (True Sheet 4 prerequisite). Open /examples/sheet in the dev build to try it.
Files
4 files copied to the project root
__mocks__/@lodev09/react-native-true-sheet.tsxsrc/app/examples/sheet.tsxsrc/screens/examples/__tests__/sheet-example-screen.test.tsxsrc/screens/examples/sheet-example-screen.tsx