react-native - 如何为两个选项卡设置 navigationsOptions 并检查 routeName 以配置不同的 iconNames?
问题描述
我创建了一个底部导航器crateBottomNavigator
。它有 2 个标签。第一个是 a Navigator
,用 . 创建createStackNavigator
。2d是普通屏幕。我将 和 用作第二个参数navigationOptions
,tabBarIcon
以便根据:1)和 2)获得routeName
和给我们的选项卡一个不同的选项卡。icon
routeName
focused
我遵循了React Navigation docs的步骤。
问题是图标不显示!但是,这些选项卡是功能性的。
// CODE WITH PROBLEM
const MealsFavTabNavigator = createBottomTabNavigator(
{
Meals: MealsNavigator,
Favorites: FavoritesScreen
},
{
navigationOptions: ({ navigation }) => ({
tabBarIcon: ({ focused, tintColor }) => {
const { routeName } = navigation.state;
let iconName;
if (routeName === 'Meals') {
iconName = `restaurant${focused ? '' : '-menu'}`;
} else if (routeName === 'Favorites') {
iconName = `favorite${focused ? '' : '-border'}`;
}
return <MaterialIcons name={iconName} size={25} color={tintColor} />;
}
}),
tabBarOptions: {
activeTintColor: 'tomato',
inactiveTintColor: 'gray',
}
}
);
如果我将屏幕分开,那么效果很好。
// CODE WITH NO PROBLEM
const MealsFavTabNavigator = createBottomTabNavigator(
{
Meals: {
screen: MealsNavigator,
// navigationOptions in config of a navigator, only matter if that
// navigator is used inside of another navigator.
navigationOptions: {
tabBarIcon: ({ focused, tintColor }) => {
let iconName = `restaurant${focused ? '' : '-menu'}`;
return <MaterialIcons name={iconName} size={25} color={tintColor} />;
}
}
},
Favorites: {
screen: FavoritesScreen,
navigationOptions: {
tabBarLabel: 'Favorites!',
tabBarIcon: ({ focused, tintColor }) => {
let iconName = `favorite${focused ? '' : '-border'}`;
return <MaterialIcons name={iconName} size={25} color={tintColor} />;
}
}
}
},
{
tabBarOptions: {
activeTintColor: Colors.active,
inactiveColor: Colors.inactive
}
}
);
这是整个模块。
import React from 'react';
import { createStackNavigator, createAppContainer } from 'react-navigation';
import { createBottomTabNavigator } from 'react-navigation-tabs';
import { Platform } from 'react-native';
import { MaterialIcons } from '@expo/vector-icons';
import CategoriesScreen from '../screens/CategoriesScreen';
import CategoryMealsScreen from '../screens/CategoryMealsScreen';
import MealDetailScreen from '../screens/MealDetailScreen';
import FavoritesScreen from '../screens/FavoritesScreen';
import Colors from '../constants/Colors';
const MealsNavigator = createStackNavigator(
{
Categories: {
screen: CategoriesScreen
},
CategoryMeals: {
screen: CategoryMealsScreen
},
MealDetail: MealDetailScreen
},
{
defaultNavigationOptions: {
headerStyle: {
backgroundColor: Platform.OS === 'android' ? Colors.primaryColor : ''
},
headerTintColor: Platform.OS === 'android' ? 'white' : Colors.primaryColor,
headerTitle: 'A Screen'
}
}
);
const MealsFavTabNavigator = createBottomTabNavigator(
{
Meals: MealsNavigator,
Favorites: FavoritesScreen
},
{
navigationOptions: ({ navigation }) => ({
tabBarIcon: ({ focused, tintColor }) => {
const { routeName } = navigation.state;
let iconName;
if (routeName === 'Meals') {
iconName = `restaurant${focused ? '' : '-menu'}`;
} else if (routeName === 'Favorites') {
iconName = `favorite${focused ? '' : '-border'}`;
}
return <MaterialIcons name={iconName} size={25} color={tintColor} />;
}
}),
tabBarOptions: {
activeTintColor: 'tomato',
inactiveTintColor: 'gray',
}
}
);
export default createAppContainer(MealsFavTabNavigator);
谢谢 :)
解决方案
正如我们通过评论发现的那样,我将在此处将其写为明确的答案。
问题是作为 in 中的参数的 navigationOptionscreateBottomTabNavigator
没有可用于指定特定选项卡图标的 tabBarIcon 键。
为此,您需要将其作为参数传入 inside defaultNavigationOptions
,用于为导航器的每个项目指定标准选项,例如 tabBarIcon。
推荐阅读
- sql - 我们可以在 PGADMIN4 中创建表而不指定数据类型的长度吗?
- data-structures - Ansible在dict中的列表中显示正确的结果和条件
- java - 我应该如何将此 JSON 转换为 POJO 类?
- python - 如何创建和调用 UUID?
- ios - CleverTap 崩溃 - Swift - iOS - [CleverTap generateAppFields]
- sql - 案例陈述顺序 - 无效的列名“年月”
- kubernetes - Kubernetes,配置startupProbe读取stdout日志
- html - 保持 HTML 窗口打开直到用户关闭它
- javascript - Nodejs聚合查找返回空数组
- c# - 我可以在使用 Moq 模拟扩展方法时将属性从 Setup 方法传递给 Return 方法吗