无法从FlatList中导航到新屏幕

时间:2017-08-10 14:15:52

标签: reactjs react-native react-navigation

我的第一页FlatList是:

import React, { Component } from 'react';
import { View, StyleSheet, FlatList, Text, TouchableHighlight } from 'react-native';
import { StackNavigator } from 'react-navigation';

import MoreInfo from './MoreInfo';

export default class Page1 extends Component {
    constructor(props){
        super(props);       
    }


  render() {
    const { navigate } = this.props.navigation;   

    return (
        <View style={styles.container}>
            <FlatList
                data={users}
                renderItem={
                    ({item}) => 
                        <TouchableHighlight onPress={() => navigate('MoreInfo', { name: 'Jane' })}>
                            <Text style={styles.welcome}> {item.name} </Text>
                        </TouchableHighlight>
                    }
                keyExtractor={item => item.index}
                >
            </FlatList>
        </View>
    );
  }
}

const App = StackNavigator({
    Page1: {screen: Page1},
    MoreInfo: { screen: MoreInfo },
})

我可以在不使用导航的情况下在FlatList中显示数据。但是当我放置导航并单击列表中的任何项目时,我收到错误:

enter image description here

请帮忙。从3天开始尝试这个。

我的index.android.js

import React, { Component } from 'react';
import { AppRegistry} from 'react-native';

import MyApp2 from './src/components/MyApp2';

const MyApp2 = StackNavigator({
    Page1: {screen: Page1},
    MoreInfo: { screen: MoreInfo },
})

AppRegistry.registerComponent('MyApp2', () => MyApp2);

我的'./src/components/MyApp2'是:

import React, { Component } from 'react';
import { StyleSheet, Text, View, TextInput, ScrollView, Alert,
        FlatList, ActivityIndicator, Image,TouchableOpacity } from 'react-native';

import { Container } from 'native-base';

import AppHeader from './AppHeader';
import AppBody from './AppBody';
import AppFooter from './AppFooter';


export default class MyApp2 extends Component{
    render(){
        return(
            <Container>
                <AppHeader />
                <AppBody/>
                <AppFooter />
            </Container>            
            )
    }
}

我在AppBody中还有一些标签,其中包括Page1。我该怎么做呢?

2 个答案:

答案 0 :(得分:1)

您似乎无法在任何地方导入Page1,而且您导入MyApp2然后定义const很奇怪} StackNavigator也称为MyApp2。我无法测试这个,因为有其他文件被导入,但我相信你只需要:

  • 修复您的导入
  • 修复您的命名冲突,
  • 使用StackNavigator注册所有屏幕,以便他们都可以访问navigation道具,
  • 并为StackNavigator注册AppRegistry

试试这个:

保留 ./ src / components / MyApp2 。然后进行这些编辑(我将假设MyApp2Page1MoreInfo都位于./src/components/

Page1 文件(无论名称如何):

import React, { Component } from 'react';
import { View, StyleSheet, FlatList, Text, TouchableHighlight } from 'react-native';

export default class Page1 extends Component {
    constructor(props){
        super(props);       
    }

  render() {
    const { navigate } = this.props.navigation;   

    return (
        <View style={styles.container}>
            <FlatList
                data={users}
                renderItem={
                    ({item}) => 
                        <TouchableHighlight onPress={() => navigate('MoreInfo', { name: 'Jane' })}>
                            <Text style={styles.welcome}> {item.name} </Text>
                        </TouchableHighlight>
                    }
                keyExtractor={item => item.index}
                >
            </FlatList>
        </View>
    );
  }
}

<强> index.android.js

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

// Making an assumption for where these files are located
// since it's not in the original question.
import MyApp2 from './src/components/MyApp2';
import MoreInfo from './src/components/MoreInfo';
import Page1 from './src/components/Page1';

/**
 * This presumes that MyApp2 is the screen that will be loaded first.
 * I don't know how you are getting to Page1, but it will be accessible
 * if you navigate to it like so:
 *     this.props.navigation.navigate('Page1')
 * Once there, the navigate() in the FlatList of Page1 should work as written.
 */
const RootNavigator = StackNavigator({
    MyApp2: {screen: MyApp2},
    Page1: {screen: Page1},
    MoreInfo: { screen: MoreInfo },
})

AppRegistry.registerComponent('MyApp2', () => RootNavigator);

答案 1 :(得分:1)

index.android.js 文件中,您使用的是StackNavigator,但尚未导入。

使用:

import { StackNavigator } from react-navigation