web-dev-qa-db-fra.com

React Native - problème de navigation "indéfini n'est pas un objet (this.props.navigation.navigate)"

Je suis après ce tutoriel https://reactnavigation.org/docs/intro/ et je suis confronté à quelques problèmes.

J'utilise l'application Expo Client pour rendre mon application à chaque fois et non pas un simulateur/émulateur.

mon code est vu en bas. 

J'avais à l'origine le composant "SimpleApp" défini ci-dessus "ChatScreen", mais cela m'a donné l'erreur suivante:

Route 'Chat' devrait déclarer un écran. Par exemple: ... etc

donc j'ai déplacé la déclération de SimpleApp juste au-dessus de "AppRegistry" et qui a signalé une nouvelle erreur 

Le type d'élément n'est pas valide: chaîne attendue ..... Vous avez probablement oublié d'exporter votre composant..etc

le didacticiel n'ajoutait pas les mots clés "export default" à un composant, ce qui, à mon avis, est dû au fait que je l'exécute sur l'application Expo? j'ai donc ajouté "export default" à "HomeScreen" et l'erreur a disparu.

La nouvelle erreur que je n'arrive pas à supprimer (d'après le code ci-dessous) est la suivante:

undefined n'est pas un objet (évaluer 'this.props.navigation.navigate')

Je ne peux pas m'en débarrasser à moins d'enlever le "{}" situé autour de "const {naviguer}", mais cela interrompra la navigation lorsque j'appuierai sur le bouton de l'écran d'accueil

import React from 'react';
import {AppRegistry,Text,Button} from 'react-native';
import { StackNavigator } from 'react-navigation';

export default class HomeScreen extends React.Component {
  static navigationOptions = {
    title: 'Welcome',
  };
  render() {
    const { navigate } = this.props.navigation;
    return (
      <View>
        <Text>Hello, Chat App!</Text>
        <Button
          onPress={() => navigate('Chat')}
          title="Chat with Lucy"
        />
      </View>
    );
  }
}



class ChatScreen extends React.Component {
  static navigationOptions = {
    title: 'Chat with Lucy',
  };
  render() {
    return (
      <View>
        <Text>Chat with Lucy</Text>
      </View>
    );
  }
}

const SimpleApp = StackNavigator({
  Home: { screen: HomeScreen },
  Chat: { screen: ChatScreen },
});
AppRegistry.registerComponent('SimpleApp', () => SimpleApp);
8
user3676224

Avec Expo, vous ne devriez pas enregistrer l'application vous-même, vous devriez laisser Expo le faire, en gardant à l'esprit que vous devez toujours exporter le composant par défaut: Vous devez également importer View and Button de react-native: sous le code complet:

import React from 'react';
import {
  AppRegistry,
  Text,
  View,
  Button
} from 'react-native';
import { StackNavigator } from 'react-navigation';

 class HomeScreen extends React.Component {
  static navigationOptions = {
    title: 'Welcome',
  };
  render() {
    const { navigate } = this.props.navigation;
    return (
      <View>
        <Text>Hello, Chat App!</Text>
        <Button
          onPress={() => navigate('Chat', { user: 'Lucy' })}
          title="Chat with Lucy"
        />
      </View>
    );
  }
}

 class ChatScreen extends React.Component {
  // Nav options can be defined as a function of the screen's props:
  static navigationOptions = ({ navigation }) => ({
    title: `Chat with ${navigation.state.params.user}`,
  });
  render() {
    // The screen's current route is passed in to `props.navigation.state`:
    const { params } = this.props.navigation.state;
    return (
      <View>
        <Text>Chat with {params.user}</Text>
      </View>
    );
  }
}

const  SimpleAppNavigator = StackNavigator({
  Home: { screen: HomeScreen },
  Chat: { screen: ChatScreen }
});

const AppNavigation = () => (
  <SimpleAppNavigator  />
);

export default class App extends React.Component {
  render() {
    return (
        <AppNavigation/>
    );
  }
}
14

Informations supplémentaires: Lorsque vous imbriquez des composants enfants, vous devez passer la navigation en tant que prop dans le composant parent . // parent.js <childcomponent navigation={this.props.navigation}/>

Et vous pouvez accéder à la navigation comme ceci//child.js entrez la description de l'image icithis.props.navigation.navigate('yourcomponent');

Référence: https://reactnavigation.org/docs/fr/connecting-navigation-prop.html

0
Bobur Kobulov