Реагируйте нативно, Перенаправляйте с экрана-заставки на другой экран

#reactjs #react-native #navigation #splash-screen

Вопрос:

Я пытаюсь перейти с экрана на другой экран через 5 секунд, и я получаю эту ошибку:

введите описание изображения здесь

Код с экрана заставки:

 import React, {Component} from 'react';
import {Platform, StyleSheet, Text, View,Alert, ImageBackground,Image,AsyncStorage,ActivityIndicator} from 'react-native';
import { StackNavigator } from 'react-navigation';
 

export default class App extends Component<Props> {
 
componentDidMount () {
    setTimeout(() => {
    //  this._retrieveData();
     this.props.navigation.replace("Journeys");
    
    }, 5000)
  }
 
 
render() {

    return (
        <ImageBackground 
            source={require('../../assets/rsz_blue_bg.png')} 
            style = {{flex: 1, height: '100%', width: '100%', resizeMode : 'stretch'}}>

        <Image 
            source={require('../../assets/logo_white.png')}
            style = {{ width: '100%', height:'70%', marginTop: 100 }}
        />
        </ImageBackground>
        );
        
        
    }   
}
 

Код от App.js:

 import React, { useContext, useEffect } from 'react'; 
import { NavigationContainer } from '@react-navigation/native';
import { createStackNavigator } from '@react-navigation/stack';
import { createDrawerNavigator } from '@react-navigation/drawer';

import Icon from 'react-native-vector-icons/Ionicons';
 

//Я делаю импорт здесь, но я сокращаю код, чтобы иметь возможность публиковать 🙂

 const AuthStack = createStackNavigator()

const AuthStackScreen = () => (
  <AuthStack.Navigator screenOptions={{headerShown: false}}>
    <AuthStack.Screen name="SignIn" component={SignInScreen} />
    <AuthStack.Screen name="SignUp" component={SignUpScreen} />
  </AuthStack.Navigator>
)

const FirstStack = createStackNavigator()

const FirstStackScreen = ({navigation}) => (
  <FirstStack.Navigator screenOptions={{
    headerStyle: {
      backgroundColor: '#009387'
    },
    headerTintColor: '#fff',
    headerTitleStyle: {
      fontWeight: 'bold',
      // alignSelf: 'center',
    }
  }}>
  
    <FirstStack.Screen 
      name="Journeys" 
      component={TrackCreateScreen}
      options={{
        headerLeft: () => (
          <Icon.Button 
          name="ios-menu" 
          size={25} 
          backgroundColor="#009387"
          onPress={() => {navigation.openDrawer()}}></Icon.Button>
        )
      }} 
      />
  </FirstStack.Navigator>
)

const TrackListStack = createStackNavigator()

const TrackListScreens = ({navigation}) => (
  <TrackListStack.Navigator screenOptions={{
    headerStyle: {
      backgroundColor: '#009387'
    },
    headerTintColor: '#fff',
    headerTitleStyle: {
      fontWeight: 'bold'
    }
  }}>
    <TrackListStack.Screen 
    name="History" 
    component={TrackListScreen} 
    options={{
      headerLeft: () => (
        <Icon.Button 
        name="ios-menu" 
        size={25} 
        backgroundColor="#009387"
        onPress={() => {navigation.openDrawer()}}></Icon.Button>
      )
    }} 
    />
    <TrackListStack.Screen name="Journey Details" component={TrackDetailScreen} />
  </TrackListStack.Navigator>
)

const AccountStack = createStackNavigator()

const AccountScreens = ({navigation}) => (
  <AccountStack.Navigator screenOptions={{
    headerStyle: {
      backgroundColor: '#009387'
    },
    headerTintColor: '#fff',
    headerTitleStyle: {
      fontWeight: 'bold'
    }
  }}>
    <AccountStack.Screen
    name="Account" 
    component={AccountScreen} 
    options={{
      headerLeft: () => (
        <Icon.Button 
        name="ios-menu" 
        size={25} 
        backgroundColor="#009387"
        onPress={() => {navigation.openDrawer()}}></Icon.Button>
      )
    }} 
    />

  </AccountStack.Navigator>
)


const AppStack = createDrawerNavigator()

const AppStackScreen = ({navigation}) => (
  <AppStack.Navigator drawerContent={props => <DrawerContent {...props}/>}>
    <AppStack.Screen name="Journey" component={FirstStackScreen} />
    <AppStack.Screen name="History" component={TrackListScreens} />
    <AppStack.Screen name="Account" component={AccountScreens} />
  </AppStack.Navigator>
)


const App = () => {
  const { state } = useContext(AuthContext)

  if(state.isLoading) {
    return <LoadingScreen />
  }

  return (
    <NavigationContainer>
          <SplashScreen/>
    </NavigationContainer>
  )
}

export default () => (
  <AuthProvider>
    <LocationProvider>
      <TrackProvider>
        <App />
      </TrackProvider>
    </LocationProvider>
  </AuthProvider>
)
 

Или, если у вас есть лучший вариант для этого перенаправления, в любом случае все в порядке.
Я пробовал разные методы и наверняка делаю что-то не так.

Пожалуйста, помогите.

Ответ №1:

это недоступно в setTimeout.

 componentDidMount () {
    let self = this;
    setTimeout(() => {
    //  this._retrieveData();
     self.props.navigation.replace("Journeys");
    
    }, 5000)
  }