属性'navigation'在类型'Readonly <{}>和Readonly <{children?上不存在:ReactNode; }>

时间:2020-01-22 17:19:39

标签: javascript typescript react-native

我是完全陌生的。

我具有以下组成部分:

播放列表:

export default class Playlists extends Component {
  playlists = [
    ...
  ];

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

    return (
      <FlatList
        data={this.playlists}
        renderItem={({item}) => (
          <TouchableOpacity
            style={styles.item}
            onPress={() => navigation.navigate('PlaylistDetails', item)}>
            <Text style={styles.text}>{item.name}</Text>
          </TouchableOpacity>
        )}
      />
    );
  }
}

播放列表的详细信息视图:

export default class PlaylistDetails extends Component {
  render() {
    const {navigation} = this.props.navigation;
    var songs: Song[] = navigation.getParam('songs');

    return (
      <View>
        <Text>{navigation.getParam('name')}</Text>
        <FlatList
          data={songs}
          renderItem={({item: song}) => <Text>{song.title}</Text>}
        />
      </View>
    );
  }
}

对于导航:

const screens = {
  Playlists: {
    screen: Playlists,
  },
  PlaylistDetails: {
    screen: PlaylistDetails,
  },
};

const stack = createStackNavigator(screens);

export default createAppContainer(stack);

但是在const { navigation } = this.props.navigation;处出现错误Property 'navigation' does not exist on type ...

我尝试添加以下代码:

interface Props {
    navigation: any
}

,然后添加以下内容:

export default class PlaylistDetails extends Component<Props> {
    ...
}

这消除了错误,但是当我运行应用程序时,出现以下错误:TypeError: undefined is not an object (evaluating 'navigation.navigate')

我是完全陌生的,不愿意解决这个问题。我希望有人能帮助我。

1 个答案:

答案 0 :(得分:4)

一切都很好,您正在定义正确的界面。

但是,您应该传播道具,而不是深入1层并传播props对象内的navigation属性。

它应该是这样的:

export default class PlaylistDetails extends Component<Props> {
  render() {

    // edit this: 
    const { navigation } = this.props;
    var songs: Song[] = navigation.getParam('songs');

    return (
      <View>
        <Text>{navigation.getParam('name')}</Text>
        <FlatList
          data={songs}
          renderItem={({item: song}) => <Text>{song.title}</Text>}
        />
      </View>
    );
  }
}