【问题标题】:Icon is not displaying in react-navigation-header-buttons (React Native)react-navigation-header-buttons 中未显示图标(React Native)
【发布时间】:2020-07-25 06:36:44
【问题描述】:

我正在尝试使用 react-navigation-header-buttons 库向 headerRight 添加一个图标。但是显示的是图标的标题而不是图标。

这是应该显示图标的代码。

import React, { useState, useLayoutEffect } from 'react';
import { View, Text, Button, StyleSheet } from 'react-native'

import { MEALS } from '../data/DummyData';
import { HeaderButtons, Item } from 'react-navigation-header-buttons';
import { HeaderButton } from '../components/CustomHeaderButton';

const MealDetailScreen = props => {
    const mealId = props.route.params.mealId;
    const selectedMeal = MEALS.find(meal => meal.id == mealId);
    const [headerTitle, setHeaderTitle] = useState();

    useLayoutEffect(() => {
        setHeaderTitle(() => selectedMeal === undefined ? props.route.params.title : selectedMeal.title)
        props.navigation.setOptions({
            headerTitle: headerTitle,
            headerRight: () => (
                <HeaderButtons HeaderButtonComponent={HeaderButton}>
                    <Item
                        title="Favourite"
                        iconName="ios-star"
                        onPress={() => {
                            console.log('Mark as favorite!');
                        }}
                    />
                </HeaderButtons>
            )
        });
    }, [props.navigation, headerTitle]);


    return (
        <View>
            <Text>The Meal Detail Screen!</Text>
            <Text>{selectedMeal.title}</Text>
            <Button title="Go Back to Categories!" onPress={() => {
                props.navigation.popToTop();
            }} />
        </View>
    )
}

const styles = StyleSheet.create({
});

export default MealDetailScreen;

这是标题按钮的自定义组件。

import React from 'react';
import { Platform } from 'react-native';
import { HeaderButton } from 'react-navigation-header-buttons';
import { Ionicons } from '@expo/vector-icons';

import Colors from '../constants/Colors';

const CustomHeaderButton = props => {
    return (
        <HeaderButton
            {...props}
            IconComponent={Ionicons}
            iconSize={23}
            color={Platform.OS === 'android' ? 'white' : Colors.primaryColor}
        />);
}

export default CustomHeaderButton;

只有 title 在 headerRight 显示。

<Item
  title="Favourite"
  iconName="ios-star"
  onPress={() => {
  console.log('Mark as favorite!');
  }}
/>

React Native 版本:5 react-navigation-header-buttons 版本:3.0.5

【问题讨论】:

    标签: react-native react-native-android react-navigation react-native-button


    【解决方案1】:

    问题在于您的组件导入语句。

    代替

    import { HeaderButton } from '../components/CustomHeaderButton';
    

    键入

    import HeaderButton from '../components/CustomHeaderButton';
    

    【讨论】:

      【解决方案2】:

      我在给出的示例中发现,IconComponent(无论出于何种原因)没有被传递到Item。由于 IconComponent 未定义,因此使用了 Text 组件。那个逻辑可以看here

      我解决此问题的方法是创建一个自定义组件,该组件将返回 HeaderButtons 而不是 HeaderButton

      import React from 'react';
      import { Ionicons } from '@expo/vector-icons';
      import Colors from '../constants/colors';
      import { Platform } from 'react-native';
      import { HeaderButtons, HeaderButton } from 'react-navigation-header-buttons';
      
      const CustomHeaderButton = (props) => (
        <HeaderButton
          IconComponent={Ionicons}
          iconSize={23}
          color={Platform.OS === 'android' ? 'white' : Colors.primaryColor}
          {...props}
        />
      );
      
      export const CustomHeaderButtons = (props) => {
        return <HeaderButtons HeaderButtonComponent={CustomHeaderButton} {...props} />;
      };
      export { Item } from 'react-navigation-header-buttons';
      

      现在你可以像这样使用它了:

      import { CustomHeaderButtons, Item } from '../components/HeaderButton';
      ...
      MealDetailScreen.navigationOptions = navigationData => {
        const mealId = navigationData.navigation.getParam('mealId');
        const selectedMeal = MEALS.find(meal => meal.id === mealId);
        return {
          headerTitle: selectedMeal.title,
          headerRight: () => (
            <CustomHeaderButtons>
              <Item
                title='Favorite'
                iconName='ios-star'
                onPress={() => { console.log('Marked as favorite!') }}
              />
            </CustomHeaderButtons>
          )
        };
      };
      

      【讨论】:

      • IconComponent={Ionicons} -> 我可以在 IconComponent 中使用多个图标库,以便我使用来自不同库的不同图标名称,IconComponent={Ionicons | Fontawesome} 类似这样的东西
      【解决方案3】:

      我通过 2 处更改解决了同样的问题:

      1. 而不是:
      import { HeaderButton } from '../components/CustomHeaderButton'; 
      

      输入:

      import HeaderButton from '../components/HeaderButton';
      
      1. 我用箭头函数返回,并在headerRight中将其设置为变量headerRightButton:
      MealDetailScreen.navigationOptions = (navigationData) => {
          const mealId = navigationData.navigation.getParam('mealId');
          const selectedMeal = MEALS.find(meal => meal.id === mealId);
          const headerRightButton = () => {
              return (
                  <HeaderButtons HeaderButtonComponent={HeaderButton}>
                                  <Item 
                                      title= 'Favorite'
                                      iconName="ios-star"
                                      onPress= {() => {
                                          console.log('Added to favorites');
                                      }}
                                  />
                                  <Item 
                                      title= 'Favorite'
                                      iconName= "ios-star-outline"
                                      onPress= {() => {
                                          console.log('Added to favorites2');
                                      }}
                                  /> 
                            </HeaderButtons>
              );
          };
          return {
                  headerTitle: selectedMeal.title,
                  headerRight: (headerRightButton)
              };
      };
          
      
      

      【讨论】:

        【解决方案4】:

        这可能是标题的背景颜色有问题。

        我的案例:标题按钮出现在 Android 中,但没有出现在 iOS(iPhone) 中。

        解决方案:更改以下行以应用独立于平台的背景

        来自

        color={Platform.OS === 'android' ? 'white' : Colors.primaryColor}
        

        color='white'
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-02-06
          • 1970-01-01
          相关资源
          最近更新 更多