#javascript #reactjs #react-native #react-navigation
#javascript #reactjs #реагировать -родной #реакция-навигация
Вопрос:
Вот мой AppNavigation.js
import React from "react";
import { Animated, Easing, Image, StyleSheet, Alert } from "react-native";
import { connect } from "react-redux";
import {
createReactNavigationReduxMiddleware,
reduxifyNavigator
} from "react-navigation-redux-helpers";
import { createDrawerNavigator } from 'react-navigation-drawer';
import HomeScreen from "../screens/HomeScreen";
import LogoutScreen from "../screens/LogoutScreen";
import LoginScreen from "../screens/LoginScreen";
import SignupScreen from "../screens/SignupScreen";
import WelcomeScreen from "../screens/WelcomeScreen";
import { AppIcon, AppStyles } from "../AppStyles";
import { Configuration } from "../Configuration";
import DrawerContainer from "../components/DrawerContainer";
import { createStackNavigator } from 'react-navigation-stack';
import { createBottomTabNavigator } from 'react-navigation-tabs'
const noTransitionConfig = () => ({
transitionSpec: {
duration: 0,
timing: Animated.timing,
easing: Easing.step0
}
});
const middleware = createReactNavigationReduxMiddleware(
"root",
state => state.nav
);
// login stack
const LoginStack = createStackNavigator(
{
Login: { screen: LoginScreen },
Signup: { screen: SignupScreen },
Welcome: { screen: WelcomeScreen }
},
{
initialRouteName: "Welcome",
headerMode: "float",
navigationOptions: ({ navigation }) => ({
headerTintColor: "red",
headerTitleStyle: styles.headerTitleStyle
}),
cardStyle: { backgroundColor: "#FFFFFF" }
}
);
const HomeStack = createStackNavigator(
{
Home: { screen: HomeScreen }
},
{
initialRouteName: "Home",
headerMode: "float",
defaultNavigationOptions: {
title: 'Centered',
headerTitleAlign: "center"
},
navigationOptions: ({ navigation }) => ({
headerTintColor: "blue",
headerTitleStyle: styles.headerTitleStyle
}),
cardStyle: { backgroundColor: "#FFFFFF" }
}
);
const LogoutStack = createStackNavigator(
{
Logout: { screen: LogoutScreen }
},
{}
);
const TabNavigator = createBottomTabNavigator(
{
Home: { screen: HomeStack },
Logout: {
screen: LogoutStack, // Empty screen, useless in this specific case
navigationOptions: ({navigation}) => ({
tabBarOnPress: (scene, jumpToIndex) => {
return Alert.alert( // Shows up the alert without redirecting anywhere
'Confirmation required',
'Do you really want to logout?',
[
{text: 'Accept', onPress: () => { navigation.dispatch({ type: 'Logout' }) }},
{text: 'Cancel'}
]
);
},
})
},
},
{
defaultNavigationOptions: ({ navigation }) => ({
tabBarIcon: ({ focused, tintColor }) => {
const { routeName } = navigation.state;
let iconName;
if (routeName === "Home") {
iconName = AppIcon.images.home;
}
if (routeName === "Logout") {
iconName = AppIcon.images.logout;
}
// You can return any component that you like here! We usually use an
// icon component from react-native-vector-icons
return (
<Image
style={{
tintColor: focused ? AppStyles.color.tint : AppStyles.color.grey,
width: 25,
height: 25,
resizeMode: 'stretch',
}}
source={iconName}
/>
);
}
}),
initialLayout: {
height: 300
},
tabBarOptions: {
showIcon: true,
showLabel: true,
activeTintColor: AppStyles.color.tint,
inactiveTintColor: "gray",
style: {
height: Configuration.home.tab_bar_height
}
}
}
);
// drawer stack
const DrawerStack = createDrawerNavigator (
{
Tab: TabNavigator
},
{
drawerPosition: "left",
initialRouteName: "Tab",
drawerWidth: 200,
contentComponent: DrawerContainer
}
);
// Manifest of possible screens
const RootNavigator = createStackNavigator(
{
LoginStack: { screen: LoginStack },
DrawerStack: { screen: DrawerStack }
},
{
// Default config for all screens
headerMode: "none",
initialRouteName: "DrawerStack",
transitionConfig: noTransitionConfig,
navigationOptions: ({ navigation }) => ({
color: "black"
})
}
);
const AppWithNavigationState = reduxifyNavigator(RootNavigator, "root");
const mapStateToProps = state => ({
state: state.nav
});
const AppNavigator = connect(mapStateToProps)(AppWithNavigationState);
const styles = StyleSheet.create({
headerTitleStyle: {
fontWeight: "bold",
textAlign: "center",
alignSelf: "center",
color: "black",
flex: 1,
fontFamily: AppStyles.fontName.main
}
});
export { RootNavigator, AppNavigator, middleware };
Вот LogoutScreen.js
import React from "react";
import {
View,
} from "react-native";
import { connect } from "react-redux";
import { withNavigation } from 'react-navigation';
class LogoutScreen extends React.Component {
static navigationOptions = ({ navigation }) => ({
title: "Logout"
});
constructor(props) {
super(props);
}
render() {
return (
<View>
</View>
);
}
}
const mapStateToProps = state => ({});
export default withNavigation(LogoutScreen);
Вот index.js
import { NavigationActions } from "react-navigation";
import { combineReducers } from "redux";
import { RootNavigator } from "../navigations/AppNavigation";
import firebase from "react-native-firebase";
import AsyncStorage from '@react-native-async-storage/async-storage';
// Start with two routes: The Main screen, with the Login screen on top.
const firstAction = RootNavigator.router.getActionForPathAndParams(
"LoginStack"
);
const initialNavState = RootNavigator.router.getStateForAction(firstAction);
function nav(state = initialNavState, action) {
let nextState;
switch (action.type) {
case "Login":
nextState = RootNavigator.router.getStateForAction(
NavigationActions.navigate({ routeName: "DrawerStack" }),
state
);
break;
case "Logout":
try {
nextState = RootNavigator.router.getStateForAction(
NavigationActions.navigate({ routeName: "LoginStack" }),
state
);
} catch (e) {
console.log(e);
}
break;
default:
nextState = RootNavigator.router.getStateForAction(action, state);
break;
}
// Simply return the original `state` if `nextState` is null or undefined.
return nextState || state;
}
const initialAuthState = { isLoggedIn: false };
function auth(state = initialAuthState, action) {
switch (action.type) {
case "Login":
return { ...state, isLoggedIn: true };
case "Logout":
AsyncStorage.removeItem("@accessToken");
AsyncStorage.removeItem("@refreshToken");
return { ...state, isLoggedIn: false };
default:
return state;
}
}
const AppReducer = combineReducers({
nav,
auth
});
export default AppReducer;
Я не знаю, что я делаю не так. Я получаю «ошибка типа: неопределенный не является объектом (оценка ‘navigation.state’)», когда я нажимаю на кнопку вкладки выхода из системы, посмотрите const TabNavigator = createBottomTabNavigator
.
Я перепробовал все, что смог найти, но пока безуспешно. Я хочу завершить дальнейшее поведение: когда кто-то нажимает на кнопку выхода из системы на панели вкладок, он выходит из системы и перенаправляется на экран входа в систему.
Комментарии:
1. Вы пробовали этот экспорт { RootNavigator: с навигацией (RootNavigator), AppNavigator, промежуточное программное обеспечение}; или попробуйте этот экспорт const toExport = { RootNavigator: с навигацией (RootNavigator), AppNavigator, промежуточное программное обеспечение}; экспорт в экспорт; дайте мне знать, сработало ли это для вас
2. Это дает мне синтаксическую ошибку
3. В чем синтаксическая ошибка
4. Неожиданный токен, ожидаемый «,». И затем он указывает на «:»
export { RootNavigator:
Также экспорт по умолчанию не работает, тогда я получаю «main не зарегистрирован»5. просто попробуйте изменить имя ключа, экспортировать { RootNavigatorTest: withNavigation (RootNavigator), AppNavigator, промежуточное программное обеспечение}; и когда вы импортируете, это должно быть import {RootNavigatorTest}, попробуйте это