如何将道具从 createBottomTabNavigator 发送到每个标签屏幕?

How to send props from createBottomTabNavigation to every tab screen?

我正在使用 createBottomTabNavigation,我有 4 个屏幕,我可以通过按屏幕底部的标签栏屏幕来访问它们。我还使用 Stack Navigation 在那里显示屏幕的标题,而且所有屏幕都有相同的设置图标。

我可以在处理“设置”图标上的 onPress 事件的每个屏幕中执行相同的功能,但这是重复的,我不想这样做。

我的问题是 - 有没有办法让我将一个函数作为 props 从包含底部导航的 App 组件传递到每个屏幕?

应用屏幕代码:

<NavigationContainer >
 <Tab.Navigator initialRouteName="Home"  tabBarOptions={{
       activeTintColor: '#FF9F0A',
       inactiveTintColor:'white',
       style: {
        backgroundColor:'#000000',//color you want to change
          borderTopWidth: 0,
          paddingTop:5,
          paddingBottom:5,
       },
      
     }}>
   <Tab.Screen name="Home" component={Home}  options={{
         tabBarLabel: 'HOME',
         tabBarIcon: ({ color, size }) => (
           <HomeTabIcon name="home" color={color} size={size} />
         ),
       }}/>
   <Tab.Screen name="Controls" component={Controls} options={{
         tabBarLabel: 'CONTROLS',
         tabBarIcon: ({ color, size }) => (
           <ControlsTabIcon name="controls" color={color} size={size} />
         ),
       }}/>
   <Tab.Screen name="Charging" component={Charging} options={{
         tabBarLabel: 'CHARGING',
         tabBarIcon: ({ color, size }) => (
           <ChargingTabIcon name="charging"  color={color} size={size}/>  
         ),
        
       }}/>

充电画面:

   function Charging() {
  return (
    <View style={globalStyles.container}>
      <Text>Charging</Text>
      <StatusBar style="auto" />
    </View>
  );
}

export default function ChargingStackScreen() {
  return (
    <ChargingStack.Navigator>
      <ChargingStack.Screen name="CHARGING" component={Charging} options={{ 
         headerRight: () => (
          <View style={globalStyles.headerRight}>
            <SettingsIcon />
          </View>
        ),
        headerTitleAlign:'left',
        headerTintColor: 'white',
        headerTitleStyle: globalStyles.headerTitle,
        headerStyle:  globalStyles.header
         }}/>
    </ChargingStack.Navigator>
  );
}

所以我认为你应该做的是将 header 作为一个单独的组件,你可以在其中使用 useNavigation 挂钩(假设你使用的是最新版本的 react-navigation),并让设置按钮执行您需要的导航。然后只在 Tab.Navigator 上方渲染 header 组件一次,而不是在每个屏幕上渲染它。

类似于:

function Header(props){
    const navigation = useNavigation();
    

    // component code
    <SettingsButton onPress={() => navigation.navigate(whatever)}/>

}

然后我很确定(虽然不是 100%)你可以在你的 NavigationContainer 中渲染它,比如:

<NavigationContainer >
<Header/>
 <Tab.Navigator initialRouteName="Home"  tabBarOptions={{
  // rest of the code