Search code examples
react-nativecomponentsreact-native-flatlist

Why isn't my FlatList showing in React Native?


I am following a tutorial but as I code along I am stuck,

Why isn't my FlatList not showing?

App.js is simply returning MessagesScreen "screen".

This is my code for a MessagesScreen:

import React from "react";
import { FlatList } from "react-native";

import ListItem from "../components/ListItem";

const messages = [
  {
    id: 1,
    title: "T1",
    description: "D1",
    image: require("../assets/mosh.jpg"),
  },
  {
    id: 2,
    title: "T2",
    description: "D2",
    image: require("../assets/mosh.jpg"),
  },
  {
    id: 3,
    title: "T3",
    description: "D3",
    image: require("../assets/mosh.jpg"),
  },
  {
    id: 4,
    title: "T4",
    description: "D4",
    image: require("../assets/mosh.jpg"),
  },
];

const MessagesScreen = () => {
  return (
    <FlatList>
      data={messages}
      keyExtractor={(message) => message.id.toString()}
      renderItem=
      {({ item }) => {
        return (
          <ListItem
            title={item.title}
            subTitle={item.subTitle}
            image={item.image}
          />
        );
      }}
    </FlatList>
  );
};

export default MessagesScreen;
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.6.3/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.6.3/umd/react-dom.production.min.js"></script>

This is my component for the ListItem:

import React from "react";
import { View, StyleSheet, Image } from "react-native";
import AppText from "./AppText";

import colors from "../config/colors";

function ListItem({ title, subTitle, image }) {
  return (
    <View style={styles.container}>
      <Image style={styles.image} source={image} />
      <View>
        <AppText style={styles.title}>{title}</AppText>
        <AppText style={styles.subTitle}>{subTitle}</AppText>
      </View>
    </View>
  );
}

const styles = StyleSheet.create({
  container: {
    flexDirection: "row",
  },
  image: {
    width: 70,
    height: 70,
    borderRadius: 35,
    marginRight: 10,
  },
  subTitle: {
    color: colors.medium,
  },
  title: {
    fontWeight: "500",
  },
});

export default ListItem;
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.6.3/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.6.3/umd/react-dom.production.min.js"></script>

What I've tried is to use the return inside the "renderItem", but with no work, also done it without. The code doesn't give me any errors, so I can't see where the problem is.


Solution

  • Oh it's just a quick fix.

    FlatList should be one tag:

    const MessagesScreen = () => {
      return (
        <FlatList // <--- edit here
          data={messages}
          keyExtractor={(message) => message.id.toString()}
          renderItem=
          {({ item }) => {
            return (
              <ListItem
                title={item.title}
                subTitle={item.subTitle}
                image={item.image}
              />
            );
          }}
        /> // <--- and here
      );
    };
    

    Here's a codesandbox to demonstrate