我正在尝试对该登录页面https://github.com/itzpradip/react-navigation-v5-mix进行编码。
我做到了,它工作得很好,问题在于它在屏幕底部有4个选项卡,如果我删除其中的一个,则所有选项卡都会显示为紫色。我不知道该怎么解决。我将用this GIF进行演示。
这是代码(当我尝试删除MainTabScreen.js的<Tab.Screen name="Profile" component={() => {}} />
行时会发生问题):
App.js
import 'react-native-gesture-handler';
import React, { useEffect } from 'react';
import { View, ActivityIndicator } from 'react-native';
import { createDrawerNavigator } from '@react-navigation/drawer';
import AsyncStorage from '@react-native-community/async-storage';
import {
NavigationContainer,
DefaultTheme as NavigationDefaultTheme,
DarkTheme as NavigationDarkTheme,
} from '@react-navigation/native';
import {
Provider as PaperProvider,
DefaultTheme as PaperDefaultTheme,
DarkTheme as PaperDarkTheme,
} from 'react-native-paper';
import { DrawerContent } from './screens/DrawerContent';
import MainTabScreen from './screens/MainTabScreen';
import { AuthContext } from './components/context';
import RootStackScreen from './screens/RootStackScreen';
const Drawer = createDrawerNavigator();
const App = () => {
// const [isLoading, setIsLoading] = React.useState(true);
// const [userToken, setUserToken] = React.useState(null);
const [isDarkTheme, setIsDarkTheme] = React.useState(false);
const initialLoginState = {
isLoading: true,
userName: null,
userToken: null,
};
const CustomDefaultTheme = {
...NavigationDefaultTheme,
...PaperDefaultTheme,
colors: {
...NavigationDefaultTheme.colors,
...PaperDefaultTheme.colors,
background: '#ffffff',
text: '#333333',
},
};
const CustomDarkTheme = {
...NavigationDarkTheme,
...PaperDarkTheme,
colors: {
...NavigationDarkTheme.colors,
...PaperDarkTheme.colors,
background: '#333333',
text: '#ffffff',
},
};
const theme = isDarkTheme ? CustomDarkTheme : CustomDefaultTheme;
const loginReducer = (prevState, action) => {
// eslint-disable-next-line default-case
switch (action.type) {
case 'RETRIEVE_TOKEN':
return {
...prevState,
userToken: action.token,
isLoading: false,
};
case 'LOGIN':
return {
...prevState,
userName: action.id,
userToken: action.token,
isLoading: false,
};
case 'LOGOUT':
return {
...prevState,
userName: null,
userToken: null,
isLoading: false,
};
case 'REGISTER':
return {
...prevState,
userName: action.id,
userToken: action.token,
isLoading: false,
};
}
};
const [loginState, dispatch] = React.useReducer(
loginReducer,
initialLoginState
);
const authContext = React.useMemo(
() => ({
signIn: async (foundUser) => {
// setUserToken('fgkj');
// setIsLoading(false);
const userToken = String(foundUser[0].userToken);
const userName = foundUser[0].username;
try {
await AsyncStorage.setItem('userToken', userToken);
} catch (e) {
console.log(e);
}
// console.log('user token: ', userToken);
dispatch({ type: 'LOGIN', id: userName, token: userToken });
},
signOut: async () => {
// setUserToken(null);
// setIsLoading(false);
try {
await AsyncStorage.removeItem('userToken');
} catch (e) {
console.log(e);
}
dispatch({ type: 'LOGOUT' });
},
signUp: () => {
// setUserToken('fgkj');
// setIsLoading(false);
},
toggleTheme: () => {
// eslint-disable-next-line no-shadow
setIsDarkTheme((isDarkTheme) => !isDarkTheme);
},
}),
[]
);
useEffect(() => {
setTimeout(async () => {
// setIsLoading(false);
let userToken;
userToken = null;
try {
userToken = await AsyncStorage.getItem('userToken');
} catch (e) {
console.log(e);
}
// console.log('user token: ', userToken);
dispatch({ type: 'RETRIEVE_TOKEN', token: userToken });
}, 1000);
}, []);
if (loginState.isLoading) {
return (
<View style={{ flex: 1, justifyContent: 'center', alignItems: 'center' }}>
<ActivityIndicator size="large" />
</View>
);
}
return (
<PaperProvider theme={theme}>
<AuthContext.Provider value={authContext}>
<NavigationContainer theme={theme}>
{loginState.userToken !== null ? (
<Drawer.Navigator
drawerContent={(props) => <DrawerContent {...props} />}
>
<Drawer.Screen name="HomeDrawer" component={MainTabScreen} />
</Drawer.Navigator>
) : (
<RootStackScreen />
)}
</NavigationContainer>
</AuthContext.Provider>
</PaperProvider>
);
};
export default App;
MainTabScreen.js
import React from 'react';
import { Dimensions } from 'react-native';
import { createMaterialBottomTabNavigator } from '@react-navigation/material-bottom-tabs';
import { createStackNavigator } from '@react-navigation/stack';
import Icon from 'react-native-vector-icons/FontAwesome';
import Ionicons from 'react-native-vector-icons/Ionicons';
import TrackerScreen from '../../MapTracking/index';
import DataScreen from './DataScreen';
import MapScreen from './MapScreen';
const TrackerStack = createStackNavigator();
const DataStack = createStackNavigator();
const MapStack = createStackNavigator();
const Tab = createMaterialBottomTabNavigator();
const { width } = Dimensions.get('window');
const TrackerStackScreen = ({ navigation }) => (
<TrackerStack.Navigator
screenOptions={{
headerStyle: {
backgroundColor: '#009387',
},
headerTintColor: '#fff',
headerTitleStyle: {
fontWeight: 'bold',
paddingLeft: width / 2 - 140,
},
}}
>
<TrackerStack.Screen
name="Tracker"
component={TrackerScreen}
options={{
title: 'Monitoramento',
headerLeft: () => (
<Ionicons.Button
name="ios-menu"
iconStyle={{ paddingLeft: 10 }}
size={25}
backgroundColor="#009387"
onPress={() => navigation.openDrawer()}
/>
),
}}
/>
</TrackerStack.Navigator>
);
const DataStackScreen = ({ navigation }) => (
<DataStack.Navigator
screenOptions={{
headerStyle: {
backgroundColor: '#1f65ff',
},
headerTintColor: '#fff',
headerTitleStyle: {
fontWeight: 'bold',
paddingLeft: width / 2 - 100,
},
}}
>
<DataStack.Screen
name="Dados"
component={DataScreen}
options={{
headerLeft: () => (
<Ionicons.Button
name="ios-menu"
iconStyle={{ paddingLeft: 10 }}
size={25}
backgroundColor="#1f65ff"
onPress={() => navigation.openDrawer()}
/>
),
}}
/>
</DataStack.Navigator>
);
const MapStackScreen = ({ navigation }) => (
<MapStack.Navigator
screenOptions={{
headerStyle: {
backgroundColor: 'rgba(231,76,60,1)',
},
headerTintColor: '#fff',
headerTitleStyle: {
fontWeight: 'bold',
paddingLeft: width / 2 - 130,
},
}}
>
<MapStack.Screen
name="Mapeamento"
component={MapScreen}
options={{
headerLeft: () => (
<Ionicons.Button
name="ios-menu"
size={25}
iconStyle={{ paddingLeft: 10 }}
backgroundColor="rgba(231,76,60,1)"
onPress={() => navigation.openDrawer()}
/>
),
}}
/>
</MapStack.Navigator>
);
const MainTabScreen = () => (
<Tab.Navigator initialRouteName="Tracker" activeColor="#fff">
<Tab.Screen
name="Tracker"
component={TrackerStackScreen}
options={{
tabBarLabel: 'Monitoramento',
tabBarColor: '#009387',
tabBarIcon: ({ color }) => (
<Icon name="location-arrow" color={color} size={26} />
),
}}
/>
<Tab.Screen
name="Dados"
component={DataStackScreen}
options={{
tabBarLabel: 'Dados',
tabBarColor: '#1f65ff',
tabBarIcon: ({ color }) => (
<Icon name="info-circle" color={color} size={26} />
),
}}
/>
<Tab.Screen name="Profile" component={() => {}} />
<Tab.Screen
name="Map"
component={MapStackScreen}
options={{
tabBarLabel: 'Mapeamento',
tabBarColor: 'rgba(231,76,60,1)',
tabBarIcon: ({ color }) => <Icon name="map" color={color} size={26} />,
}}
/>
</Tab.Navigator>
);
export default MainTabScreen;
依赖项
"dependencies": {
"@mauron85/react-native-background-geolocation": "^0.6.3",
"@react-native-community/async-storage": "^1.9.0",
"@react-native-community/masked-view": "^0.1.10",
"@react-navigation/drawer": "^5.8.2",
"@react-navigation/material-bottom-tabs": "^5.1.6",
"@react-navigation/native": "^5.5.1",
"@react-navigation/stack": "^5.0.6",
"react": "16.11.0",
"react-native": "0.62.2",
"react-native-action-button": "^2.8.5",
"react-native-animatable": "^1.3.3",
"react-native-background-timer": "^2.2.0",
"react-native-camera": "git+https://git@github.com/react-native-community/react-native-camera.git",
"react-native-geolocation-service": "^5.0.0",
"react-native-gesture-handler": "^1.6.1",
"react-native-linear-gradient": "^2.5.6",
"react-native-maps": "^0.27.1",
"react-native-paper": "^3.6.1",
"react-native-reanimated": "^1.9.0",
"react-native-safe-area-context": "^3.0.5",
"react-native-screens": "^2.9.0",
"react-native-vector-icons": "^6.6.0",
"rn-fetch-blob": "^0.12.0"
},
有人可以帮助我吗?