reactjs - 无法从 FlatList 中导航到新屏幕

标签 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

请帮忙。三天以来一直在尝试这个。

我的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 。我该怎么办?

最佳答案

看起来您没有在任何地方导入 Page1,而且导入 MyApp2 然后定义 const 也很奇怪对于也称为 MyApp2StackNavigator。我无法对此进行测试,因为还有其他文件正在导入,但我相信您只需要:

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

试试这个:

保留./src/components/MyApp2不变。然后进行这些编辑(我将假设 MyApp2Page1MoreInfo 均位于 ./src 中/组件/:

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);

关于reactjs - 无法从 FlatList 中导航到新屏幕,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45616255/

相关文章:

javascript - 无法使用不同的参数渲染相同的路由React Router v4

javascript - 在reactjs中登录后无法重定向

react-native - react native FlatList 与列,最后一项宽度

react-native - 如何使选项卡栏图标的溢出在 React Native 中可点击?

react-native - 屏幕之间导航但构造函数未调用

javascript - React 组件的基于状态的动画

javascript - 如何使用 FormatJs 消息语法将数字格式化为带两位小数的百分比?

react-native - 使用 SectionList 时无法读取未定义的属性 'length'

react-native - React-Native 中的 DocumentPicker 无法在 Android 设备上正常工作

android - 当用户打开抽屉时调用函数(onClick 按钮或幻灯片)