인프런 커뮤니티 질문&답변

sehun910124님의 프로필 이미지

작성한 질문수

비전공자를 위한 진짜 입문 올인원 개발 부트캠프

메인 화면 구현 - 3

에뮬레이터에 화면 흰색만나오는 문제

작성

·

180

1

import { API_URL } from "./config/constants.js";
import avatarImg from "./assets/icons/avatar.png";
import React from "react";
import {
  StyleSheet,
  Text,
  View,
  Image,
  ScrollView,
  Dimensions,
  TouchableOpacity,
  Alert,
} from "react-native";
import { GestureHandlerRootView } from "react-native-gesture-handler";
import Carousel from "react-native-reanimated-carousel";

import axios from "axios";
import dayjs from "dayjs";
import relativeTime from "dayjs/plugin/relativeTime";
import "dayjs/locale/ko";

dayjs.extend(relativeTime);
dayjs.locale("ko");

export default function App() {
  const [products, setProducts] = React.useState([]);
  const [banners, setBanners] = React.useState([]);

  React.useEffect(() => {
    axios
      .get(`${API_URL}/products`)
      .then((result) => {
        const products = result.data.products;
        setProducts(products);
      })
      .catch((error) => {
        console.log("error :", error);
      });

    axios
      .get(`${API_URL}/banners`)
      .then((result) => {
        const banners = result.data.banners;
        setBanners(banners);
      })
      .catch((error) => {
        console.log("error :", error);
      });
  }, []);

  return (
    <GestureHandlerRootView>
      <View style={styles.container}>
        <ScrollView>
          <Carousel
            data={banners}
            width={Dimensions.get("window").width}
            height={200}
            autoPlay={true}
            sliderWidth={Dimensions.get("window").width}
            itemWidth={Dimensions.get("window").width}
            itemHeight={200}
            renderItem={(obj) => {
              return (
                <TouchableOpacity
                  onPress={() => {
                    Alert.alert("배너 클릭");
                  }}
                >
                  <Image
                    style={styles.bannerImage}
                    source={{ uri: `${API_URL}/${obj.item.imageUrl}` }}
                    resizeMode="contain"
                  />
                </TouchableOpacity>
              );
            }}
          />
          <Text style={styles.headline}>판매되는 상품들!</Text>
          <View style={styles.productList}>
            {products.map((product, index) => {
              return (
                <View key={index} style={styles.productCard}>
                  {product.soldout === 1 && <View style={styles.productBlur} />}
                  <View>
                    <Image
                      style={styles.productImg}
                      source={{
                        uri: `${API_URL}/${product.img_url}`,
                      }}
                      resizeMode={"contain"}
                    />
                  </View>
                  <View style={styles.productContents}>
                    <Text style={styles.productName}>{product.name}</Text>
                    <Text style={styles.productPrice}>{product.price}원</Text>
                    <View style={styles.productFooter}>
                      <View style={styles.productSeller}>
                        <Image
                          style={styles.productAvatar}
                          source={avatarImg}
                        />
                        <Text style={styles.productSellerName}>
                          {product.seller}
                        </Text>
                      </View>
                      <Text style={styles.productDate}>
                        {dayjs(product.created_at).fromNow()}
                      </Text>
                    </View>
                  </View>
                </View>
              );
            })}
          </View>
        </ScrollView>
      </View>
    </GestureHandlerRootView>
  );
}

const styles = StyleSheet.create({
  headline: {
    fontSize: 24,
    fontWeight: "800",
    marginTop: 10,
    marginBottom: 10,
  },
  container: {
    flex: 1,
    backgroundColor: "#fff",
    paddingTop: 32,
    margin: 10,
  },
  productCard: {
    width: "100%",
    borderColor: "rgb(230,230,230)",
    borderWidth: 1,
    borderRadius: 16,
    backgroundColor: "white",
    marginBottom: 10,
  },
  productBlur: {
    position: "absolute",
    top: 0,
    bottom: 0,
    right: 0,
    left: 0,
    backgroundColor: "#ffffffaa",
    zIndex: 999,
  },
  productImg: {
    width: "100%",
    height: 210,
  },
  productContents: {
    padding: 8,
  },
  productSeller: {
    flexDirection: "row",
  },
  productAvatar: {
    width: 24,
    height: 24,
  },
  productFooter: {
    flexDirection: "row",
    justifyContent: "space-between",
    alignItems: "center",
    marginTop: 12,
  },
  productName: {
    fontSize: 14,
  },
  productPrice: {
    fontSize: 16,
    fontWeight: "600",
    marginTop: 8,
  },
  productSellerName: {
    fontSize: 14,
  },
  productDate: {
    fontSize: 14,
  },
  productList: {
    alignItems: "center",
  },
  bannerImage: {
    width: "100%",
    height: 200,
  },
});

 

스크린샷 2024-01-17 오후 3.22.29.png

어떤 오류메세지도 뜨지않고,

에뮬레이터에 화면이 출력되지않는 문제가 발생합니다.

Carousel을 적용하기전에는 화면 잘 출력되었는데,

Carousel을 적용하니 화면이 출력되지않네요..

Error: PanGestureHandler must be used as a descendant of GestureHandlerRootView. Otherwise the gestures will not be recognized. See https://docs.swmansion.com/react-native-gesture-handler/docs/installation for more details.

이러한 오류가 발생해서
GestureHandlerRootView 태그로
최상단에 묶어주니 저 오류는 사라졌는데,

애뮬레이터의 화면이 출력되지 않는 문제가 발생합니다.

서버는 잘 연결되어있는걸 확인햇습니다..

뭐가문제일까요



답변 2

1

sehun910124님의 프로필 이미지
sehun910124
질문자

해결했습니다!

혹시 어떻게 해결하셨을까요...? 저도 같은 문제를 겪고 있습니다 ㅠㅠ

0

안녕하세요, 인프런 AI 인턴입니다. sehun910124님.

React Native 강의 수강 중 Carousel 적용 후 화면이 제대로 출력되지 않는 문제에 대해 질문해주셨습니다. 해당 문제를 접하는 다른 수강생들의 유사한 경우를 조사해본 결과, React Native에서 사용하는 Carousel 컴포넌트에 관련된 질문들 중 이와 관련하여 다음과 같은 답변을 찾을 수 있었습니다:

  1. react native snap carousel 오류 문의

    • 이 게시물에서는 react-native-snap-carousel 라이브러리를 사용할 때 발생하는 오류와 해결 방법에 대해 설명합니다. 해당 라이브러리에서 ViewPropTypes 관련 문제가 발생했을 때의 해결법을 제시합니다. 비록 직접적으로 Carousel이 나타나지 않는 문제를 다루지는 않지만, Carousel 관련 오류를 해결하는 데 참고가 될 수 있습니다.
  2. 배너가 안보여요..ㅠㅠ

    • 이 질문에서는 Carousel이 제대로 나타나지 않는 문제를 다루고 있습니다. 질문자가 코드에서 발생한 실수를 찾지 못해 도움을 요청했으며, 지식공유자가 오타로 인해 banners 데이터가 정의되지 않은 문제를 지적했습니다.
  3. 배너가 나오지 않습니다.

    • 이 경우도 배너, 즉 Carousel이 화면에 나타나지 않는 문제가 제기되었습니다. 지식공유자는 banners 데이터가 제대로 들어가지 않은 것 같다고 언급하며 banners 및 관련 이미지 스타일에 주목할 것을 권장합니다. 이 답변은 Carousel 데이터 처리와 관련된 문제점을 진단할 때 유용하게 활용할 수 있습니다.

질문자님의 코드에서 Carousel 컴포넌트 적용 후 발생하는 문제와 관련하여 다음 사항들을 확인해보시면 도움이 될 수 있습니다:
- 서버로부터 받은 데이터(products, banners)가 정상적으로 Carousel에 전달되고 있는지 확인하세요.
- Carousel 컴포넌트의 설정이 정확한지, sliderWidthitemWidth 등의 속성 값이 적절하게 설정되었는지 확인하세요.
- 오류가 없는 경우, Carousel에 도달하는지 혹은 렌더링 중에 어떠한 오류가 발생하는지 확인하기 위해 각 상태의 변화 또는 렌더링 과정에서 발생하는 모든 단계를 콘솔 로그로 찍어보세요.
- GestureHandlerRootView를 올바르게 사용하고 있는지, 이 컴포넌트 밖에서 PanGestureHandler는 사용되지 않고 있는지 점검하세요.

위 링크를 참조하여 유사 문제의 해결 방법을 적용해 보시고, 혹은 주신 코드에서 디버깅을 통하여 문제를 해결해 보시길 바랍니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.