Невозможно перейти к следующему экрану в React Native - PullRequest
0 голосов
/ 31 марта 2020

Я создал список сообщений и хочу передать данные одного сообщения c на другой экран. Я хочу, чтобы можно было нажать на сообщение и перейти к экрану сведений о сообщении. Это файл PostList. js:

import React, {Component} from 'react';
import {
  FlatList,
  StyleSheet,
  View,
  Text,
  Modal,
  TouchableOpacity,
} from 'react-native';
import Post from './Post';
import Firebase from 'firebase';
import 'firebase/database';
import {firebaseConfig} from './configFirebase';
import PostDetails from './stack/PostDetails';

export default class Posts extends Component {
  constructor(props) {
    super(props);
    !Firebase.apps.length
      ? Firebase.initializeApp(firebaseConfig.firebase)
      : Firebase.app();

    this.state = {
      postList: [],
      navigation: this.props.navigation,
    };
  }
  state = {
    loading: false,
    currentPost: null,
  };

  componentDidMount() {
    this.getPostData();
  }

  getPostData = () => {
    const ref = Firebase.database().ref('/posts');
    ref.on('value', snapshot => {
      console.log('DATA RETRIEVED');
      const postsObject = snapshot.val();
      if (!postsObject) {
        return console.warn('No data from firebase');
      }
      const postsArray = Object.values(postsObject);
      this.setState({postList: postsArray});
    });
  };

  render() {
    return (
      <View style={styles.container}>
        <FlatList
          keyExtractor={post => post.heading}
          data={this.state.postList}
          renderItem={({item: post}) => (
            <Post
              key={post.heading}
              heading={post.heading}
              description={post.description}
              location={post.location}
              onPress={() => this.props.navigation.push('PostDetails', {post})}
            />
          )}
        />
      </View>
    );
  }
}

export const styles = StyleSheet.create({
  container: {
    borderWidth: 2,
    borderRadius: 5,
    backgroundColor: '#2bb76e',
    flex: 1,
  },
  txtInput: {
    flex: 1,
    margin: 5,
    padding: 5,
    borderWidth: 2,
    fontSize: 20,
    borderRadius: 5,
    backgroundColor: 'snow',
  },
});

Я пробовал navigation.navigate () и navigation.pu sh (), но ни один из них не работает.

Это Экран PostDetails Я хочу перейти и передать информацию поста:

import React from 'react';
import {Text, View} from 'react-native';

export default ({route}) => {
  const postInfo = route.params.post;

  return (
    <View>
      <Text>{JSON.stringify(postInfo, null, 2)}</Text>
      <Text>{postInfo.heading}</Text>
    </View>
  );
};

Это мой файл HomeStack, где хранятся экраны:

import React from 'react';
import {NavigationContainer} from '@react-navigation/native';
import {createStackNavigator} from '@react-navigation/stack';
import Posts from '../PostList';
import AddForm from '../AddForm';
import PostDetails from './PostDetails';

const HomeStack = createStackNavigator();

const HomeStackScreen = () => (
  <HomeStack.Navigator>
    <HomeStack.Screen
      name="PostList"
      component={Posts}
      options={{headerTitle: 'big APPetite'}}
    />
    <HomeStack.Screen
      name="PostDetails"
      component={PostDetails}
      options={({route}) => ({heading: route.params.post.heading})}
    />
    <HomeStack.Screen name="NewPost" component={AddForm} />
  </HomeStack.Navigator>
);

export default HomeStackScreen;

Post. js:

import React, {Component} from 'react';
import {
  Image,
  Text,
  StyleSheet,
  View,
  TextInput,
  FlatList,
  TouchableOpacity,
} from 'react-native';
import FavouriteButton from './buttons/FavouriteButton';
import chickenClub from './images/chickenSandwich.jpg';

const Post = ({heading, description, location, username}) => (
  <TouchableOpacity style={postStyle.container}>
    <View style={(postStyle.container, {alignItems: 'flex-start'})}>
      <View style={postStyle.padding}>
        <Image style={postStyle.image} source={chickenClub} />
        <View style={{backgroundColor: (255, 255, 255, 45), borderRadius: 6}}>
          <Text style={postStyle.text}>{heading}</Text>
          <Text style={postStyle.text}>{location}</Text>
          <Text style={postStyle.text}>{username}*username*</Text>
        </View>
      </View>

      <View
        style={{
          alignSelf: 'flex-end',
          flexDirection: 'column',
          backgroundColor: '#2bb76e',
        }}>
        <Text style={postStyle.paragraph}>{description}</Text>
        <View style={{justifyContent: 'flex-start', alignItems: 'flex-end'}}>
          <FavouriteButton />
        </View>
      </View>
    </View>
  </TouchableOpacity>
);

const postStyle = StyleSheet.create({
  container: {
    borderWidth: 2,
    borderRadius: 5,
    backgroundColor: '#2bb76e',
    flex: 1,
  },
  padding: {
    padding: 10,
  },
  heading: {
    backgroundColor: (255, 250, 250, 50),
    flexDirection: 'column',
  },
  paragraph: {
    alignSelf: 'flex-end',
    fontSize: 20,
  },
  username: {},
  image: {
    flexDirection: 'row',
    height: 150,
    width: 150,
  },
  text: {
    fontSize: 25,
    padding: 5,
  },
});
export default Post;

1 Ответ

0 голосов
/ 31 марта 2020

Вы передаете onPress своему компоненту Post, однако вы не применяете эту опору для TouchableOpacity.

Изменение компонента Post для включения:

const Post = ({heading, description, location, username, onPress}) => (
  <TouchableOpacity style={postStyle.container} onPress={onPress}>
...