React Navigation v5 setOptions不工作

xzabzqsa  于 2023-08-07  发布在  React
关注(0)|答案(3)|浏览(156)

我正试图从我的组件内的堆栈屏幕设置导航选项,因为我需要从我的屏幕呈现一个带有特定操作的右标题按钮。问题是它不起作用。我使用的结构如下:

  1. -StackNavigator
  2. -MaterialTopTabNavigator
  3. -tab1
  4. -tab2
  5. -tab3

字符串
当前代码:

  1. //My navigation
  2. <NavigationContainer initialState={initialState} ref={ref}>
  3. <Stack.Navigator screenOptions={{ headerShown: false }}>
  4. //some other Stacks
  5. <Stack.Screen
  6. name="Detail"
  7. component={DetailTabScreen}
  8. options={{
  9. headerShown: true, //header works ok
  10. headerRight: () => ( //this would work
  11. <View style={{backgroundColor: 'red', width: 100}}/>
  12. )
  13. }}
  14. />
  15. </Stack.Navigator>
  16. </NavigationContainer>


我的详细信息选项卡屏幕:

  1. const TopTab = createMaterialTopTabNavigator()
  2. const DetailTabScreen = () => (
  3. <StoreProvider>
  4. <SafeAreaView style={{ flex: 1 }}>
  5. <TopTab.Navigator
  6. tabBarOptions={{
  7. ...options
  8. }}
  9. >
  10. <TopTab.Screen
  11. name="PlanDetail"
  12. component={PlanDetail}
  13. options={{
  14. tabBarLabel: ({ color }: TabBarLabelProps) => (
  15. <Text>Detalles</Text>
  16. ),
  17. }}
  18. />
  19. <TopTab.Screen
  20. name="PlanChat"
  21. component={PlanChat}
  22. options={{
  23. tabBarLabel: ({ color }: TabBarLabelProps) => (
  24. <Text>Chat</Text>
  25. ),
  26. }}
  27. />
  28. <TopTab.Screen
  29. name="Participants"
  30. component={Participants}
  31. options={{
  32. tabBarLabel: ({ color }: TabBarLabelProps) => (
  33. <Text>Participantes</Text>
  34. ),
  35. }}
  36. />
  37. </TopTab.Navigator>
  38. </SafeAreaView>
  39. </StoreProvider>
  40. )


我已经尝试过使用useLayoutEffect设置组件内部的选项,也尝试过使用useEffect

  1. useLayoutEffect(() => {
  2. props.navigation.setOptions({
  3. headerRight: () => (//does not work
  4. <TouchableOpacity
  5. onPress={() => console.warn('This is a button!')}
  6. style={{marginRight:16}}
  7. >
  8. <Icon name={Platform.OS === 'ios' ? 'share-apple' : 'share-google'} type="EvilIcons" style={{ color: colors.darkGreen, marginright: 16 }} />
  9. </TouchableOpacity>
  10. ),
  11. });
  12. }, []);


PS:我知道隐藏头文件并为我的头文件使用自定义组件可以作为一种解决方案,但我想知道为什么navigation.setOptions不起作用。
任何帮助,任何想法将不胜感激,谢谢!

ktca8awb

ktca8awb1#

This帮了我我通过dangerouslyGetParent()方法访问父堆栈导航器并设置其选项来解决这个问题。

  1. useLayoutEffect(() => {
  2. const stackNavigator = props.navigation.dangerouslyGetParent(); // this is what you need
  3. if (stackNavigator) {
  4. stackNavigator.setOptions({
  5. headerRight: () => (
  6. <TouchableOpacity
  7. onPress={() => console.warn("This is a button!")}
  8. style={{ marginRight: 16 }}
  9. >
  10. <Icon
  11. name={Platform.OS === "ios" ? "share-apple" : "share-google"}
  12. type="EvilIcons"
  13. style={{ color: colors.darkGreen, marginright: 16 }}
  14. />
  15. </TouchableOpacity>
  16. ),
  17. });
  18. }
  19. }, []);

字符串

展开查看全部
nhaq1z21

nhaq1z212#

标签导航器本身没有任何标题。子项位于TopTab中。导航器将无法访问父导航(即Stack.Navigator)。您需要将父导航示例传递给选项卡的子选项卡,或者从堆栈中隐藏标题并在选项卡子选项卡中创建自己的标题组件。另一个选择是像下面这样将监听器附加到选项卡屏幕,然后您可以更新父堆栈的头部。

  1. const DetailTabScreen = (props) => {
  2. ....
  3. <TopTab.Screen
  4. name="PlanDetail"
  5. component={PlanDetail}
  6. options={{
  7. tabBarLabel: ({ color }: TabBarLabelProps) => (
  8. <Text>Detalles</Text>
  9. ),
  10. }}
  11. listeners={{
  12. tabPress: (e) => {
  13. // Prevent default action
  14. props.navigation.setOptions({
  15. title: 'PlanDetail',
  16. });
  17. },
  18. }}
  19. />

字符串
你可以在这里找到更多细节

展开查看全部
i34xakig

i34xakig3#

  1. function SomeScreen({navigation}) {
  2. useLayoutEffect(() => {
  3. navigation.setOptions({
  4. headerRight: () => <TouchableOpacity
  5. onPress={() => console.warn('This is a button!')}
  6. style={{ marginRight: 16 }}>
  7. <Icon name={Platform.OS === 'ios' ? 'share-apple' : 'share-google'}
  8. type="EvilIcons" style={{ color: colors.darkGreen, marginright: 16 }} />
  9. </TouchableOpacity>
  10. });
  11. }, [navigation]);
  12. }

字符串

相关问题