Expo 路由器实验性堆栈
基于 react-native-screens 实验性 gamma 堆栈构建的 Stack 可选同级组件。仅供测试使用。
For the complete documentation index, see llms.txt. Use this file to discover all available pages.
重要
ExperimentalStack是一个 alpha API,可在 Expo SDK 56 及更高版本中使用。它仅用于测试——在准备好用于生产环境之前,API 和功能集都可能发生变化。
ExperimentalStack 是 Stack 的同级组件,由新的 react-native-screens/experimental 栈提供支持。它需要按导航器逐个启用:在你想迁移的特定布局中,将 <Stack /> 替换为 <ExperimentalStack />,并在其他所有地方继续使用 <Stack />。
我们提前分享它,是为了让你可以在应用中试用并告诉我们还缺少什么。当前支持的选项范围是刻意限制的,并且会随着时间推移逐步扩展。
有关适用于原生和 Web 应用的基于文件的路由库的更多信息,请参阅 Expo Router 参考文档。
支持的功能
支持的屏幕选项:
titleheaderShownheaderTransparentheaderBackVisible
在 Android 上,ExperimentalStack 支持 预测性返回手势。你仍然需要在你的 app config 中将 android.predictiveBackGestureEnabled 设置为 true,才能为应用启用它。
平台支持
ExperimentalStack 仅支持原生平台。在 Web 上,它会回退到标准的 Stack,因此同一布局可以在各平台上工作,而无需条件代码。
基本用法
import { ExperimentalStack as Stack } from 'expo-router'; export default function Layout() { return ( <Stack screenOptions={{ headerShown: true }}> <Stack.Screen name="index" options={{ title: 'Home' }} /> <Stack.Screen name="details" options={{ title: 'Details' }} /> </Stack> ); }
你可以像使用 Stack 一样组合使用 ExperimentalStack.Screen 和 ExperimentalStack.Protected。
已知限制
屏幕选项有限
ExperimentalStack 仅支持 title、headerShown、headerTransparent 和 headerBackVisible。传递任何其他选项(例如 headerLeft、headerRight、headerTitle、headerStyle、headerTintColor、动画覆盖项、状态栏选项)都会在开发环境中记录警告,并且不会生效。对于需要这些选项的屏幕,请继续使用 <Stack />。
在 Android 上不能与 Stack 混用
在 Android 上,ExperimentalStack 和标准的 Stack 不能共存于同一个应用中——请为你的原生栈选择一种导航器类型。我们希望在未来的版本中取消这一限制,这样你就可以一次迁移一个导航器。
提示 我们正在积极开发
ExperimentalStack,并期待你的反馈。你可以在 Discord 上分享想法、在 GitHub 上提交 issue,或者使用本页底部的 反馈 按钮。
安装
ExperimentalStack 是 expo-router 的一部分。如果你的项目中尚未安装,请按照 Expo Router 安装指南进行操作:
了解如何在你的项目中安装 Expo Router。
API
import { ExperimentalStack } from 'expo-router';
Components
Type: React.Element<Omit<Omit<ExperimentalStackNavigatorProps, 'children' | 'initialRouteName' | 'layout' | 'screenListeners' | 'screenOptions' | 'screenLayout' | 'UNSTABLE_router' | 'UNSTABLE_routeNamesChangeBehavior' | 'id'> & DefaultRouterOptions<string> & { children: ReactNode; layout?: ((props: { state: StackNavigationState<ParamListBase>; navigation: NavigationHelpers<ParamListBase, {}>; descriptors: Record<...>; children: ReactNode; }) => ReactElement<...>) | undefined; ... 4 more ...; UNSTABLE_routeNamesChangeBehavior?: "firstMatch" | ... 1 more ... | undefined; ..., 'children'> & Partial<Pick<Omit<ExperimentalStackNavigatorProps, 'children' | 'initialRouteName' | 'layout' | 'screenListeners' | 'screenOptions' | 'screenLayout' | 'UNSTABLE_router' | 'UNSTABLE_routeNamesChangeBehavior' | 'id'> & DefaultRouterOptions<string> & { children: ReactNode; layout?: ((props: { state: StackNavigationState<ParamListBase>; navigation: NavigationHelpers<ParamListBase, {}>; descriptors: Record<...>; children: ReactNode; }) => ReactElement<...>) | undefined; ... 4 more ...; UNSTABLE_routeNamesChangeBehavior?: "firstMatch" | ... 1 more ... | undefined; ..., 'children'>>>
Renders the new react-native-screens/experimental native stack.
Sibling to Stack. Native-only — on web it falls back to the standard Stack.
Opt-in per navigator: replace <Stack /> with <ExperimentalStack /> in the
specific layout you want to migrate.
Type: React.Element<StackScreenProps>
Type: React.Element<StackScreenBackButtonProps>
Component to configure the back button.
Can be used inside Stack.Screen in a layout or directly inside a screen component.
Example
import { Stack } from 'expo-router'; export default function Layout() { return ( <Stack> <Stack.Screen name="detail"> <Stack.Screen.BackButton displayMode="minimal">Back</Stack.Screen.BackButton> </Stack.Screen> </Stack> ); }
Example
import { Stack } from 'expo-router'; export default function Page() { return ( <> <Stack.Screen.BackButton hidden /> <ScreenContent /> </> ); }
Note: If multiple instances of this component are rendered for the same screen, the last one rendered in the component tree takes precedence.
Deprecated: Use
Stack.Titleinstead.
Type: React.Element<StackTitleProps>
Props
ExperimentalStackNavigationProp<ParamList, RouteName, NavigatorID>RouteProp<ParamList, RouteName>Types
Navigator-level events emitted by ExperimentalStack. Mirrors the subset of
NativeStackNavigationEventMap that the gamma Stack.Screen lifecycle
callbacks can drive.
| Property | Type | Description |
|---|---|---|
| gestureCancel | {
data: undefined
} | - |
| transitionEnd | {
data: {
closing: boolean
}
} | - |
| transitionStart | {
data: {
closing: boolean
}
} | - |
Type: NavigationHelpers<ParamListBase, ExperimentalStackNavigationEventMap>
Options accepted by ExperimentalStack screens. Mirrors the narrow option
surface of the gamma <Stack.HeaderConfig> component from
react-native-screens/experimental. Anything outside this shape is dropped
with a __DEV__ warning at runtime.
| Property | Type | Description |
|---|---|---|
| headerBackVisible(optional) | boolean | - |
| headerShown(optional) | boolean | - |
| headerTransparent(optional) | boolean | - |
| title(optional) | string | - |
Literal Type: union
Acceptable values are: NavigationProp<ParamList, RouteName, NavigatorID, StackNavigationState<ParamList>, ExperimentalStackNavigationOptions, ExperimentalStackNavigationEventMap> | StackActionHelpers<ParamList>