react-navigation - 使用 React Navigation 5 在选项卡双击时重置选项卡内的堆栈
问题描述
我想知道如果 Tab 被聚焦并按下,如何重置 BottomTabNavigator 内的堆栈。
这是我到目前为止的代码:
const Stack = createStackNavigator<MainStackParams>()
const BottomTab = createBottomTabNavigator<TabNavigatorParams>()
const navigationRef = React.useRef()
> Blockquote
<NavigationContainer ref={navigationRef}>
<Stack.Navigator mode="modal">
<Stack.Screen
name={MainAppRoute.BOTTOM_TAB_NAVIGATOR}
component={BottomTabNavigator}
/>
...
</Stack.Navigator>
</NavigationContainer>
function BottomTabNavigator() {
return (
<BottomTab.Navigator>
<BottomTab.Screen
name={TabNavigatorRoute.SOME_STACK}
component={SomeStack}
listeners={{tabPress: e => {
// TODO: Reset stack in current tab (unsure how to do this)
}}}
/>
...
</BottomTab.Navigator>
)
}
在 TODO 中(在代码片段中)可能应该完成以下操作:
- 从应用 NavigationContainer 获取 navigationRef
- 检查选定的 BottomTab 是否聚焦(以确定双击)
- e.preventDefault
- 重置
SomeStack
(不确定如何在 BottomTabNavigator 中获取导航对象的堆栈)
有没有人能够做到这一点?感谢所有答案:)
解决方案
好吧,基本上你有两个选项来管理这个,首先是检查导航状态,但我发现它只适用于 IOS 设备,android 不做任何事情。
这段代码从此 stacknavigator 导航到第一个屏幕
<Tab.Screen name={`DeviceNavigatorTab`} component={DeviceNavigator} options={{
tabBarIcon: ({tintColor}) => <Image source={require('../../images/feather_home-menu.png')} style={{width: 26, height: 26, tintColor}}/>,
}} listeners={({ navigation, route }) => ({
tabPress: e => {
if (route.state && route.state.routeNames.length > 0) {
navigation.navigate('Device')
}
},
})} />
另一种解决方案,甚至更好,适用于 android 和 IOS 操作系统
DeviceNavigatorTab 这是选项卡导航器屏幕名称,{screen: 'Device'} 是子堆栈导航器中的第一个堆栈屏幕名称,希望对您有所帮助
<Tab.Screen name={`DeviceNavigatorTab`} component={DeviceNavigator} options={{
tabBarIcon: ({tintColor}) => <Image source={require('../../images/feather_home-menu.png')} style={{width: 26, height: 26, tintColor}}/>,
}} listeners={({ navigation }) => ({
tabPress: e => {
navigation.navigate('DeviceNavigatorTab', { screen: 'Device' });
},
})} />
它实际上并没有重置导航器,它只是转到该选项卡导航器内的指定屏幕。
推荐阅读
- wordpress - 如何在登录时更改 WooCommerce 角色?
- c++ - 在 ubuntu 上安装 c++ 标准库文件
- ruby-on-rails - 按最新登录进行设计、搜索和排序
- c++ - 如何将 QGraphicsProxyWidget 放在 QGraphicsGridLayout 上?
- excel - 通过 Excel VBA 单击链接 - getElementsByTagName 不起作用
- sql - 查询在 SQLite 上有效,但在 SQL Server 上失败
- javascript - Reactjs/SemanticUi 在地图中添加 if 条件
- datepicker - 如何将绑定变量的值传递给 SwiftUI 中两个 DatePicker 中的另一个绑定变量?
- swift - Swift中的Firebase函数调用返回值
- python - spyder 或 IPython 中奇怪的模块重新加载行为