This is documentation for the next SDK version. For up-to-date documentation, see the latest version (SDK 54).
An Expo Router submodule that provides native tabs layout.
Native tabs is an experimental feature available in SDK 54 and later, and its API is subject to change.
expo-router/unstable-native-tabs is a submodule of expo-router and exports components to build tab layouts using platform-native system tabs.
See the Expo Router reference for more information about the file-based routing library for native and web app.
Installation
To use expo-router/unstable-native-tabs in your project, you need to install expo-router in your project. Follow the instructions from Expo Router's installation guide:
Learn how to install Expo Router in your project.
Configuration in app config
If you are using the default template to create a new project, expo-router's config plugin is already configured in your app config.
Example app.json with config plugin
{ "expo": { "plugins": ["expo-router"] } }
Usage
To learn how to use native tabs, with Expo Router, read the native tabs guide:
Learn how to use native tabs in your Expo Router app.
API
import { NativeTabs, Icon, Label, Badge, VectorIcon } from 'expo-router/unstable-native-tabs';
Components
Type: React.Element<NativeTabsProps>
The component used to create native tabs layout.
Example
// In _layout file import { NativeTabs } from 'expo-router/unstable-native-tabs'; export default function Layout() { return ( <NativeTabs> <NativeTabs.Trigger name="home" /> <NativeTabs.Trigger name="settings" /> </NativeTabs> ); }
stringThe behavior when navigating back with the back button.
Acceptable values are: 'history' | 'none' | 'initialRoute'
ColorValueThe background color of every badge in the tab bar.
stringThe blur effect applied to the tab bar.
Acceptable values are: 'none' | 'systemDefault' | 'extraLight' | 'light' | 'dark' | 'regular' | 'prominent' | 'systemUltraThinMaterial' | 'systemThinMaterial' | 'systemMaterial' | 'systemThickMaterial' | 'systemChromeMaterial' | 'systemUltraThinMaterialLight' | 'systemThinMaterialLight' | 'systemMaterialLight' | 'systemThickMaterialLight' | 'systemChromeMaterialLight' | 'systemUltraThinMaterialDark' | 'systemThinMaterialDark' | 'systemMaterialDark' | 'systemThickMaterialDark' | 'systemChromeMaterialDark'
booleanWhen set to true, the tab bar will not become transparent when scrolled to the edge.
unionThe color of every tab icon in the tab bar.
Acceptable values are: ColorValue | {
default: ColorValue | undefined,
selected: ColorValue | undefined
}
unionThe style of the every tab label in the tab bar.
Acceptable values are: StyleProp<NativeTabsLabelStyle> | {
default: StyleProp<NativeTabsLabelStyle>,
selected: StyleProp<NativeTabsLabelStyle>
}
stringThe visibility mode of the tab item label.
Acceptable values are: 'auto' | 'selected' | 'labeled' | 'unlabeled'
string • Default: automaticSpecifies the minimize behavior for the tab bar.
Available starting from iOS 26.
The following values are currently supported:
automatic- resolves to the system default minimize behaviornever- the tab bar does not minimizeonScrollDown- the tab bar minimizes when scrolling down and expands when scrolling back uponScrollUp- the tab bar minimizes when scrolling up and expands when scrolling back down
See: The supported values correspond to the official UIKit documentation.
Acceptable values are: 'automatic' | 'never' | 'onScrollDown' | 'onScrollUp'
ColorValueThe color of the ripple effect when the tab is pressed.
booleanWhen set to true, enables the sidebarAdaptable tab bar style on iPadOS and macOS. This prop has no effect on iPhone.
ColorValueThe tint color of the tab icon.
Can be overridden by icon color and label color for each tab individually.
{
horizontal: number,
vertical: number
}See: Apple documentation
Type: React.ReactNode<NativeTabsTriggerBadgeProps>
stringThe text to display as the badge for the tab. If not provided, the badge will not be displayed.
hidden
boolean • Default: falseIf true, the badge will be hidden.
ColorValueType: React.ReactNode<NativeTabsTriggerIconProps>
Renders an icon for the tab.
Accepts various icon sources such as SF Symbols, drawable resources, material icons, or image sources.
Acceptable props combinations:
sfanddrawable-sfwill be used for iOS icon,drawablefor Android iconsfandsrc-sfwill be used for iOS icon,srcfor Android iconsrcanddrawable-srcwill be used for iOS icon,drawablefor Android iconsrconly -srcwill be used for both iOS and Android icons
Type: React.ReactNode<NativeTabsTriggerLabelProps>
hidden
boolean • Default: falseIf true, the label will be hidden.
StyleProp<NativeTabsLabelStyle>Type: React.Element<VectorIconProps<NameT>>
Helper component which can be used to load vector icons for NativeTabs.
Example
import { NativeTabs } from 'expo-router/unstable-native-tabs'; import MaterialCommunityIcons from '@expo/vector-icons/MaterialCommunityIcons'; export default Layout(){ return ( <NativeTabs> <NativeTabs.Trigger name="index"> <NativeTabs.Trigger.Icon src={<NativeTabs.Trigger.VectorIcon family={MaterialCommunityIcons} name="home" />} /> </NativeTabs.Trigger> </NativeTabs> ); }
Type: React.Element<NativeTabTriggerProps>
The component used to customize the native tab options both in the _layout file and from the tab screen.
When used in the _layout file, you need to provide a name prop.
When used in the tab screen, the name prop takes no effect.
Example
// In _layout file import { NativeTabs } from 'expo-router/unstable-native-tabs'; export default function Layout() { return ( <NativeTabs> <NativeTabs.Trigger name="home" /> <NativeTabs.Trigger name="settings" /> </NativeTabs> ); }
Example
// In a tab screen import { NativeTabs } from 'expo-router/unstable-native-tabs'; export default function HomeScreen() { return ( <View> <NativeTabs.Trigger> <NativeTabs.Trigger.Label>Home</NativeTabs.Trigger.Label> </NativeTabs.Trigger> <Text>This is home screen!</Text> </View> ); }
Note: You can use the alias
NativeTabs.Triggerfor this component.
ReactNodeThe children of the trigger.
Use Icon, Label, and Badge components to customize the tab.
boolean • Default: falseIf true, the tab will not pop stack to the root when selected again.
boolean • Default: falseIf true, the tab will not scroll to the top when selected again.
hidden
booleanIf true, the tab will be hidden from the tab bar.
Note: Marking a tab as
hiddenmeans it cannot be navigated to in any way.
stringThe name of the route.
This is required when used inside a Layout component.
When used in a route it has no effect.
stringSystem-provided tab bar item with predefined icon and title
Uses Apple's built-in tab bar items (e.g., bookmarks, contacts, downloads) with
standard iOS styling and localized titles. Custom icon or selectedIcon
properties will override the system icon, but the system-defined title cannot
be customized.
Acceptable values are: 'search' | 'history' | 'bookmarks' | 'contacts' | 'downloads' | 'favorites' | 'featured' | 'more' | 'mostRecent' | 'mostViewed' | 'recents' | 'topRated'
Partial<Omit<BottomTabsScreenProps, 'isFocused' | 'tabKey'>>Props passed to the underlying native tab screen implementation.
Use this to configure props not directly exposed by Expo Router, but available in react-native-screens.
Note: This will override any other props set by Expo Router and may lead to unexpected behavior.
Note: This is an unstable API and may change or be removed in minor versions.
Interfaces
| Property | Type | Description |
|---|---|---|
| drawable(optional) | string | Only for: Android The name of the drawable resource to use as an icon. |
| Property | Type | Description |
|---|---|---|
| sf(optional) | SFSymbols6_0 | {
default: SFSymbols6_0 | undefined,
selected: SFSymbols6_0
} | Only for: iOS The name of the SF Symbol to use as an icon. The value can be provided in two ways:
Example
Example
|
| Property | Type | Description |
|---|---|---|
| src(optional) | ReactElement | ImageSourcePropType | {
default: ReactElement<unknown, string | JSXElementConstructor<any>> | ImageSourcePropType | undefined,
selected: ReactElement<unknown, string | JSXElementConstructor<any>> | ImageSourcePropType
} | Only for: Android iOS The image source to use as an icon. When When The value can be provided in two ways:
Example
Example
|
Types
Type: object shaped as below:
| Property | Type | Description |
|---|---|---|
| drawable(optional) | string | Only for: Android The name of the drawable resource to use as an icon. |
| sf(optional) | SFSymbol | Only for: iOS The name of the SF Symbol to use as an icon. |
Or object shaped as below:
| Property | Type | Description |
|---|---|---|
| src(optional) | ImageSourcePropType | Promise<ImageSourcePropType | null> | The image source to use as an icon. |