原始答案
我推荐一种不同的方法。滑动时隐藏元素很困难(根据我自己的经验),根据反应导航文档不推荐:
一些选项卡导航器(例如底部选项卡导航器)也有一个 tabBarVisible 选项,可用于根据屏幕选项分辨率指南中的说明隐藏选项卡栏。但是,我们不建议使用它,因为在导航中显示/隐藏标签栏会影响堆栈导航器的动画,从而导致故障行为。
我的方法是在导航器之外定义继续按钮。
首先在您的目录根目录下创建一个RootNavigation
文件,如下所示。
import * as React from 'react';
export const navigationRef = React.createRef();
export function getCurrentRouteName() {
return navigationRef.current?.getCurrentRoute().name;
}
export function navigate(name, params) {
navigationRef.current?.navigate(name, params);
}
这个RootNavigation
文件的想法是访问navigation
道具并从我们的按钮中获取当前路线名称。如果按钮放置在导航器之外,则这是不可能的。
将 navigationRef 传递给您的NavigationContainer
.
import * as RootNavigation from './RootNavigation';
// ...
const App = () => {
return (
<NavigationContainer ref={RootNavigation.navigationRef}>
<SwiperNav />
<BottomButtons name="Continue" />
</NavigationContainer>
);
}
以下函数用于根据当前路线名称确定继续按钮应转到的下一条路线。constants
如果您愿意,您可以使用或enums
用于路由名称来清理代码。
const getSwipeNavigatorNextDestination = currentRouteName => {
switch (currentRouteName) {
case 'Introduction1':
return 'Introduction2';
break;
case 'Introduction2':
return 'Introduction3';
break;
// etc...
}
};
我不知道你的BottomButtons
组件到底是什么样子,但重要的是你定义了一个函数来处理onPress
你在哪里检索下一个目的地并使用RootNavigation
.
const BottomButtons = ({name}) => {
const handleBtnNavigate = () => {
const nextDestination = getSwipeNavigatorNextDestination(
RootNavigation.getCurrentRouteName(),
);
RootNavigation.navigate(nextDestination)
};
return <Button title={name} onPress={() => handleBtnNavigate()} />;
};
如果你想了解更多关于 RootNavigation 的想法,你可以参考文档:https ://reactnavigation.org/docs/navigating-without-navigation-prop/ 。
如果有什么不清楚的可以评论,我可以澄清。
对原始答案的扩展
您应该在您的应用程序中只使用一个 NavigationContainer。如果您想在导航到不属于介绍性屏幕的屏幕后隐藏继续按钮,我建议更改以下内容:
const App = () => {
const [isShowingIntroduction, setIsShowingIntroduction] = useState(true);
return (
<NavigationContainer ref={RootNavigation.navigationRef}>
<SwiperNav />
{isShowingIntroduction && (
<BottomButtons
name="Continue"
setIsShowingIntroduction={setIsShowingIntroduction}
/>
)}
</NavigationContainer>
);
};
有条件地显示继续按钮。
const BottomButtons = ({name, setIsShowingIntroduction}) => {
const handleBtnNavigate = () => {
const nextDestination = getSwipeNavigatorNextDestination(
RootNavigation.getCurrentRouteName(),
);
if (nextDestination == 'ScreenNotPartOfIntroduction') {
setIsShowingIntroduction(false);
}
RootNavigation.navigate(nextDestination);
};
return <Button title={name} onPress={() => handleBtnNavigate()} />;
};
我在这里所做的是在应用程序组件(继续按钮的父组件)中创建一个状态变量和随附的设置器。这允许我们将 setter 函数传递给继续按钮。然后在按钮组件内部,我们可以创建一个检查:如果nextDestination
屏幕名称不属于介绍屏幕名称集的一部分,则调用setIsShowingIntroduction(false)
. 应用程序组件更新并隐藏它导航到的按钮nextDestination
。