묻고 답해요
143만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨Vue 3 & Firebase 10 커뮤니티 만들기 풀스택 - "활용편" (with Pinia, Quasar, Tiptap, VueUse)
vite-plugin-vue-layouts 종속성 충돌 관련
안녕하세요,vue-plugin-vue-layouts 설치 시 종속성 충돌 관련 에러가 발생합니다.(node 및 npm, 그리고 package.json 내용 모두 강좌와 동일하게 진행중입니다.) github issue를 보니 vite version 관련한 문제로 보인다, 4.0.0을 지원해달라 등의 이야기가 있습니다.혹시 저와 같은 문제를 겪으신 분은 안계실까요?이 때, vite 버전 문제 관련한 부분을 해결(?)한 사람이 있더라고요.https://github.com/charrue/vite-plugin-vue-layoutsa. 원본을 fork한 이 것을 프로젝트에 설치해서 사용 시에 문제가 될까요?b. a 방법보다는, 원본에 --force 옵션을 두고 설치하는 것이 더 나은 선택일까요?
-
미해결[왕초보편] 앱 8개를 만들면서 배우는 안드로이드 코틀린(Android Kotlin)
웹뷰에서 사이트로 넘어갈 때 오류가 납니다.
package com.example.mango_content import android.content.Intent import androidx.appcompat.app.AppCompatActivity import android.os.Bundle import android.view.View import androidx.recyclerview.widget.GridLayoutManager import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView class MainActivity : AppCompatActivity() { //데이터 넣을 리스트 변수 생성 private val items = mutableListOf<ContentsModel>() override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) // 리스트 데이터 // 데이터 클래스이기 때문에 차례대로 넣을 값만 넣어주면 된다 items.add( ContentsModel( "https://app.catchtable.co.kr/ct/shop/Quiver/shopPhotoList", "https://image.toast.com/aaaaaqx/rv/s4XU7ZHko4NjDEkULtFHbAA/231108173855775(0).jpeg", "퀴버(Quiver)" ) ) items.add( ContentsModel( "https://app.catchtable.co.kr/ct/shop/bistrogama/shopPhotoList?pickup-date=231207&pickup-time=0342", "https://image.toast.com/aaaaaqx/catchtable/shopinfo/s23522/23522_2221020170729696.jpg?detail750", "비스트로 가마" ) ) items.add( ContentsModel( "https://app.catchtable.co.kr/ct/shop/cucciolo_seoul/shopPhotoList?type=VISIT_RESERVATION&pickup-date=231207&pickup-time=0346", "https://ugc-images.catchtable.co.kr/rv/s7YDg2g4TxcuMPb-Eds2nKQ/4179dd6517aa48e1900c08e8c9c769a5", "쿠촐로 서울" ) ) items.add( ContentsModel( "https://app.catchtable.co.kr/ct/shop/schedule_seongsu/shopPhotoList?type=VISIT_RESERVATION&pickup-date=231207&pickup-time=0352", "https://ugc-images.catchtable.co.kr/rv/sXGZ4Ldt3lvBgj3V-4rxIsQ/e6ce38eef9ee412ca63da36dacabc57a", "스케줄 성수" ) ) items.add( ContentsModel( "https://app.catchtable.co.kr/ct/shop/Quiver/shopPhotoList", "https://image.toast.com/aaaaaqx/rv/s4XU7ZHko4NjDEkULtFHbAA/231108173855775(0).jpeg", "퀴버(Quiver)" ) ) items.add( ContentsModel( "https://app.catchtable.co.kr/ct/shop/bistrogama/shopPhotoList?pickup-date=231207&pickup-time=0342", "https://image.toast.com/aaaaaqx/catchtable/shopinfo/s23522/23522_2221020170729696.jpg?detail750", "비스트로 가마" ) ) items.add( ContentsModel( "https://app.catchtable.co.kr/ct/shop/cucciolo_seoul/shopPhotoList?type=VISIT_RESERVATION&pickup-date=231207&pickup-time=0346", "https://ugc-images.catchtable.co.kr/rv/s7YDg2g4TxcuMPb-Eds2nKQ/4179dd6517aa48e1900c08e8c9c769a5", "쿠촐로 서울" ) ) items.add( ContentsModel( "https://app.catchtable.co.kr/ct/shop/schedule_seongsu/shopPhotoList?type=VISIT_RESERVATION&pickup-date=231207&pickup-time=0352", "https://ugc-images.catchtable.co.kr/rv/sXGZ4Ldt3lvBgj3V-4rxIsQ/e6ce38eef9ee412ca63da36dacabc57a", "스케줄 성수" ) ) val recyclerview = findViewById<RecyclerView>(R.id.rv) val rvAdapter = RVAdapter(baseContext,items) recyclerview.adapter = rvAdapter // 아이템 클릭 처리 rvAdapter.itemClick = object : RVAdapter.ItemClick { override fun onClick(view: View, position: Int) { val intent = Intent(baseContext, ViewActivity::class.java) intent.putExtra("url", items[position].url ) startActivity(intent) } } recyclerview.layoutManager = GridLayoutManager(this,2) } }MainActivity.kt package com.example.mango_content import android.content.Context import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.widget.ImageView import android.widget.TextView import androidx.appcompat.view.menu.MenuView.ItemView import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView.ViewHolder import com.bumptech.glide.Glide //viewmodel을 받을 것임 class RVAdapter(val context: Context, val List: MutableList<ContentsModel>) : RecyclerView.Adapter<RVAdapter.ViewHolder>() { override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RVAdapter.ViewHolder { val v = LayoutInflater.from(parent.context).inflate(R.layout.rv_item, parent, false) return ViewHolder(v) } // 웹뷰 클릭 이벤트 생성 interface ItemClick { fun onClick(view : View, position: Int) } var itemClick : ItemClick? = null override fun onBindViewHolder(holder: RVAdapter.ViewHolder, position: Int) { if (itemClick != null) { holder.itemView.setOnClickListener { v -> itemClick!!.onClick(v, position) } } holder.bindItems(List[position]) } override fun getItemCount(): Int { return List.size } inner class ViewHolder(itemView : View) : RecyclerView.ViewHolder(itemView) { fun bindItems(item : ContentsModel) { val rv_img = itemView.findViewById<ImageView>(R.id.rvImageArea) val rv_text = itemView.findViewById<TextView>(R.id.rvTextArea) rv_text.text = item.titleText Glide.with(context) .load(item.imageUrl) .into(rv_img) } } } RVAdapter.kt package com.example.mango_content import androidx.appcompat.app.AppCompatActivity import android.os.Bundle import android.webkit.WebView class ViewActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_view) val webView = findViewById<WebView>(R.id.webView) webView.loadUrl(intent.getStringExtra("url").toString()) } }ViewActivity.kt<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools"> <uses-permission android:name="android.permission.INTERNET" /> <application android:allowBackup="true" android:dataExtractionRules="@xml/data_extraction_rules" android:fullBackupContent="@xml/backup_rules" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/Theme.Mango_content" android:usesCleartextTraffic="true" tools:targetApi="31"> <activity android:name=".ViewActivity" android:exported="false" /> <activity android:name=".SplashActivity" android:exported="true"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name=".MainActivity" android:exported="true"></activity> </application> </manifest>manifest.xml실행 했을 시, 다음과 같은 오류가 일어납니다.망고플레이트가 서버 종료되어서 저는 캐치테이블 사이트를 이용하였습니다.오류 구글링하여 매니패스트에android:usesCleartextTraffic="true" 도 추가 하였는데 그대로 오류나서 질문 드립니다. ㅠㅠ
-
미해결[초급편] 안드로이드 커뮤니티 앱 만들기(Android Kotlin)
emailArea가 안나와요..
package com.bokchi.mysolelife.auth import android.database.DatabaseUtils import androidx.appcompat.app.AppCompatActivity import android.os.Bundle import android.widget.Toast import androidx.databinding.DataBindingUtil import com.bokchi.mysolelife.R import com.bokchi.mysolelife.databinding.ActivityIntroBinding import com.google.firebase.Firebase import com.google.firebase.auth.FirebaseAuth import com.google.firebase.auth.auth class JoinActivity : AppCompatActivity() { private lateinit var binding: ActivityIntroBinding private lateinit var auth: FirebaseAuth override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) auth = Firebase.auth binding = DataBindingUtil.setContentView(this, R.layout.activity_join) binding.joinBtn.setOnClickListener { val email = binding.emailArea } // auth.createUserWithEmailAndPassword("abc@abc.com", "12341234") // .addOnCompleteListener(this) { task -> // if (task.isSuccessful) { // Toast.makeText(this, "성공", Toast.LENGTH_LONG).show() // } else { // Toast.makeText(this, "실패", Toast.LENGTH_LONG).show() // } // } } }여기 보면 선생님과 똑같이 했는데 emailArea을 이제 칠때 빨간색으로 뜨면서 안되요...<?xml version="1.0" encoding="utf-8"?> <layout> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".auth.JoinActivity" android:orientation="vertical"> <LinearLayout android:layout_width="match_parent" android:background="@color/mainColor" android:layout_height="150dp"> <TextView android:text="회원가입" android:gravity="center" android:textStyle="bold" android:textColor="@color/black" android:textSize="20sp" android:layout_width="match_parent" android:layout_height="50dp"/> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="50dp" android:orientation="vertical"> <EditText android:id="@+id/emailArea" android:layout_width="match_parent" android:layout_height="50dp" android:hint="email" style="@style/AuthEditText"/> <LinearLayout android:layout_width="match_parent" android:background="#999999" android:layout_marginLeft="10dp" android:layout_marginRight="10dp" android:layout_height="0.5dp"/> <EditText android:id="@+id/passwordArea" android:layout_width="match_parent" android:layout_height="50dp" android:inputType="textPassword" android:hint="password" style="@style/AuthEditText"/> <LinearLayout android:layout_width="match_parent" android:background="#999999" android:layout_marginLeft="10dp" android:layout_marginRight="10dp" android:layout_height="0.5dp"/> <EditText android:id="@+id/passwordArea2" android:layout_width="match_parent" android:layout_height="50dp" android:inputType="textPassword" android:hint="password check" style="@style/AuthEditText"/> <LinearLayout android:layout_width="match_parent" android:background="#999999" android:layout_marginLeft="10dp" android:layout_marginRight="10dp" android:layout_height="0.5dp"/> <Button android:id="@+id/joinBtn" android:layout_margin="20dp" android:background="@drawable/background_radius_yellow" android:text="회원가입하기" android:layout_width="match_parent" android:layout_height="50dp"/> </LinearLayout> </LinearLayout> </layout> 여기 ID emailArea 적어져 있습니다 그런데 왜(?) 이런 오류가 뜨는 것일가요?? 알려주세요...ㅠㅠ
-
해결됨풀스택 리액트 라이브코딩 - 간단한 쇼핑몰 만들기
상품목록 불러오기, 장바구니 삭제 에러 질문 드립니다
firebase 연동 후 client와 server 실행하여 구동 중 오류 발생하여 질문 드립니다.해당 에러를 찾아보니까 'createdAt' 필드를 중복으로 사용하고 있다고 GET_PRODUCTS 쿼리에서 'createdAt' 삭제하여도 역시 그대롭니다.server/src/resolvers/product.ts강의에 설명해주신 기존 코드대로 짜니까"'QueryStartAtConstraint' 형식의 인수는 'QueryOrderByConstraint' 형식의 매개 변수에 할당될 수 없습니다. 'type' 속성의 형식이 호환되지 않습니다. '"startAt" | "startAfter"' 형식은 '"orderBy"' 형식에 할당할 수 없습니다. '"startAt"' 형식은 '"orderBy"' 형식에 할당할 수 없습니다." 라는 에러가 떠서 주석 처리를 하고 수정을 하였는데 인터넷 검색해서 이것저것 고친거라 정확한건지 모르겠네요.장바구니 삭제 에러quertClient.ts 기존 코드에서 에러로 인해 수정했습니다.추가적으로 영상에 설명하신 코드와 현재 설치 버전 호환에 차이가 많아 오류가 생겨 수정해주었습니다client/src/components/cart/item.tsx // 기존 코드 const queryClient = getClient() const { mutate: updateCart } = useMutation( ({ id, amount }: { id: string; amount: number }) => graphqlFetcher(UPDATE_CART, { id, amount }), // 수정 const queryClient = getClient() const { mutate: updateCart } = useMutation<{ updateCart: CartType }, unknown, { id: string; amount: number }>( ({ id, amount }) => graphqlFetcher(UPDATE_CART, { id, amount }),client/src/pages/products/[id].tsx // 기존 코드 const { data } = useQuery<{ product: Product }>([QueryKeys.PRODUCTS, id], () => graphqlFetcher(GET_PRODUCT, { id }), ) // 수정 const { data } = useQuery<{ product: Product }>( [QueryKeys.PRODUCTS, id], () => graphqlFetcher(GET_PRODUCT, { id }), { select: (data) => data as { product: Product }, // 선택적으로 타입 캐스팅 } );위 코드들 외에도 수정한 부분이 여러군대인데 잘못된 코드 수정으로 인하여 오류가 발생하는 것인지 궁금합니다.
-
미해결[왕초보편] 앱 8개를 만들면서 배우는 안드로이드 코틀린(Android Kotlin)
alt + 엔터를 했는데도 안나오면 어떻게 해야될까요?
Intent를 알트 + 엔터를 쳤을 때 안나오는데 어떻게 하면 나오는지 궁금합니다.
-
미해결[플러터플로우]코딩 없이 한 달 만에 앱 만들기
질문이 있습니다.
플러터플로우로 빠르게 프론트 부분을 완성시키고 세세한 validator나 인증 절차등은 flutter 코드로 구현하려고 하는데요. 이를 flutterflow의 Git repo에 push하고 다른 branch에 pull하여 플러터로 수정하는 식으로 앱을 개발해보고 있습니다.이때 Git repo의 관리 방법이나(rebase, merge, ff only 등) 퍼블리싱은 flutter로 하는 방법밖에 없는지 질문드리고 싶습니다.
-
미해결너네 백엔드 하고 싶은 거 있으면 얼마든지 해 난 괜찮어 왜냐면 나는 파이어베이스가 있어
회원가입 실행이 안되요
사전 설정은 다 제대로 한 것 같은데 회원가입하면 실패도 아니고 오류 로그가 뜹니다.. ㅠㅠapi 오류라고 해서 콘솔 sdk도 다 다시 설정해 보았는데 자꾸 오류가 뜹니다... ㅠㅠ 해결 부탁드립니다. 제 파이어베이스 API sdk입니다. useSignup.jsimport { useState } from 'react' import { appAuth } from '../firebase/config' import { createUserWithEmailAndPassword, updateProfile } from 'firebase/auth' export const useSignup = () => { // 에러 정보를 저장합니다. error 상수에 저장 기본값 null // setError -> 상태를 업데이트 하기 위한 것 const [error, setError] = useState(null); // 현재 서버와 통신중인 상태를 저장합니다. // isPending이 ture면 통신중 const [isPending, setIsPending] = useState(false); // signup 훅을 만듭니다. email, password, displayName 세가지 매개변수를 갖습니다. const signup = (email, password, displayName) => { setError(null); // 아직 에러가 없으니 null 입니다. setIsPending(true); // 통신중이므로 true입니다. // 파이어베이스에서 회원가입을 도와주는 함수 (도큐먼트에 있음) // 비밀번호 설정으로 유저 정보를 등록합니다. config에서 import 받아야합니다. createUserWithEmailAndPassword(appAuth, email, password) .then((userCredential) => { // 회원가입 // 성공했을 때, Signed in // 유저정보를 user에 담아옴 const user = userCredential.user; console.log(user); // 회원 정보를 정상적으로 받지 못하면 실패입니다. -> 경고 띄우기 if (!user) { throw new Error('회원가입에 실패했습니다.'); } // 회원 정보 업데이트 // 회원가입이 완료되고 유저 정보에 닉네임(displayName)을 업데이트합니다. import 받아야합니다.\ // appAuth.currentUser를 통해 현재 로그인 정보를 받아옴 updateProfile(appAuth.currentUser, { displayName }) .then(() => { setError(null); setIsPending(false); }).catch((err) => { //예외 처리 setError(err.message); setIsPending(false) console.log(err.message); }); }) .catch((err) => { // 예외 처리 setError(err.message); setIsPending(false); console.log(err.message); }); } // 에러값, 통신여부, signup 함수(밖에서 사용할 수 있도록) 리턴 return { error, isPending, signup } } config.js// 계정과 관련된 파이어베이스 설정 -> 깃허브에 올리면 안됨 // Import the functions you need from the SDKs you need import { initializeApp } from "firebase/app"; import { getAuth } from "firebase/auth"; import { getFirestore } from "firebase/firestore"; // Your web app's Firebase configuration const firebaseConfig = { apiKey: process.env.REACT_APP_API_KEY, authDomain: process.env.REACT_APP_AUTH_DOMAIN, projectId: process.env.REACT_APP_PROJECT_ID, storageBucket: process.env.REACT_APP_STORAGE_BUCKET, messagingSenderId: process.env.REACT_APP_MESSAGING_SENDER_ID, appId: process.env.REACT_APP_APP_ID, }; // Initialize Firebase 인증 초기화 // firebase 초기화 const app = initializeApp(firebaseConfig); const appAuth = getAuth(); // firestore 초기화 const appFireStore = getFirestore(app); // 나중에 다른 곳에서도 사용 가능하게 빼놓는 것 export{appAuth, getFirestore} .envREACT_APP_API_KEY = AIzaSyAIgKLWTMyx_t8VhSzEUB3XQF755FGB7_c REACT_APP_AUTH_DOMAIN = mydiary-ccb8c.firebaseapp.com REACT_APP_PROJECT_ID = mydiary-ccb8c REACT_APP_STORAGE_BUCKET = mydiary-ccb8c.appspot.com REACT_APP_MESSAGING_SENDER_ID = 1047629886497 REACT_APP_APP_ID = 1:1047629886497:web:59ffb871ffeb3054261f60
-
미해결[초급편] 안드로이드 커뮤니티 앱 만들기(Android Kotlin)
실행하면 바로 앱이 안떠요..
이제 처음 선생님도 앱을 실행했을때 ok라고 뜨 잖아요 그런데 저는 실행도 안되요...그래서 다시 처음부터 했는데 되지 않아요.......ㅠㅠ
-
미해결Flutter 입문 - 안드로이드, iOS 개발을 한 번에 (with Firebase)
firebase option 오류
- 안녕하세요. firebase를 사용하는 12강을 보고 따라하던 도중에 이런 에러가 발생했습니다. 재설치를 해도 init을 해서 초기화를 해도 해결이 되지 않네요. 설치후 바로 들어가는 도입부분이라 더 아리쏭합니다.
-
해결됨Vue 3 & Firebase 10 커뮤니티 만들기 풀스택 - "활용편" (with Pinia, Quasar, Tiptap, VueUse)
메뉴 컴포넌트 분리..
안녕하세요~ default.vue에서 헤더의 메뉴 부분 컴포넌트를 분리해봤는데그럼 authDialog 가 활성화가 안 되더라구요..방법이 없을까요?
-
해결됨Flutter로 SNS 앱 만들기
회원가입화면
에뮬레이터를 실행하고 회원가입화면으로 보고 싶은데, main화면이 실행됩니다
-
미해결[초급편] 안드로이드 커뮤니티 앱 만들기(Android Kotlin)
게시글/댓글 작성 후 리스트뷰에 즉시 반영이 안됩니다
안녕하세요 강사님좋은 강의 제공해주셔서 감사합니다.제목 그대로의 문제가 있어서 질문 남깁니다.BoardWrite액티비티에서 게시글 작성 후 등록 버튼을 누르고 finish()를 통해 프래그먼트로 빠져나오는 경우,그리고 BoardInside액티비티에서 댓글을 등록한 경우리스트뷰에 결과가 즉시 반영되지 않는 것 같습니다.다른 액티비티 혹은 프래그먼트로 이동 후 돌아오면 반영되긴 하지만요...강사님 영상을 보니 게시글/댓글 모두 리스트뷰에 즉시 반영되는 것 같은데...아, 차이점이 있다면 저는 binding을 쓰지 않았습니다. 혹시 이 탓일까요?
-
미해결Vue 3 & Firebase 10 커뮤니티 만들기 풀스택 - "활용편" (with Pinia, Quasar, Tiptap, VueUse)
비밀번호 재설정에서 질문있습니다!
안녕하세요, 파이어베이스 인증 부분'비밀번호 변경하기' 강의에서 궁금한 것이 있어 질문드립니다. 비밀번호 재설정을 위해 이메일로 재설정 링크를 발송하고재설정할 비밀번호를 입력하면이 창이 뜨는데, 여기서 저는 비밀번호 재설정 후 바로 제가 원하는 로그인화면으로 나왔으면 좋겠습니다. 상기의 화면은 제가 생성한 파일이 아니라firebase에서 보여주는 화면인데,그 부분은 어떻게 해야할까요, 그럼 확인부탁드리겠습니다감사합니다!
-
미해결vue.js 실전 프로젝트(트위터 클론)
배포 후 로그인 불가 현상
6월에 완성하고 파이어베이스 배포했을때는 정상적으로 작동을 했었는데 오늘 확인차 로그인을 해보려고 하니 이런 에러 메세지가 뜨면서 로그인 자체가 되질 않네요. 이전에 저장됐던 로그인 정보 파이어베이스 db에서 모두 삭제하고 새로 회원가입 후 로그인 했을때 현상입니다,.. 다른 아이디로 회원가입하고 로그인해도 똑같은 현상이 발생하네요.
-
해결됨풀스택 리액트 라이브코딩 - 간단한 쇼핑몰 만들기
graphqlFetcher 관련 에러와 , data 객체 정의 되지 않는 오류 질문 드립니다
안녕하세요. msw 강의를 듣는 중에 해결되지 않는 문제가 있어서 질문 남깁니다.pages > products > [id].tsx이 호출과 일치하는 오버로드가 없습니다.오버로드 1/3('(queryKey: QueryKey, options?: Omit<UseQueryOptions<Product, unknown, Product, QueryKey>, "queryKey"> | undefined): UseQueryResult<...>')에서 다음 오류가 발생했습니다.'() => Promise<unknown>' 유형에 'Omit<UseQueryOptions<Product, unknown, Product, QueryKey>, "queryKey">' 유형과 공통적인 속성이 없습니다.오버로드 2/3('(queryKey: QueryKey, queryFn: QueryFunction<Product, QueryKey>, options?: Omit<UseQueryOptions<Product, unknown, Product, QueryKey>, "queryKey" | "queryFn"> | undefined): UseQueryResult<...>')에서 다음 오류가 발생했습니다.'Promise<unknown>' 형식은 'Product | Promise<Product>' 형식에 할당할 수 없습니다.'Promise<unknown>' 형식은 'Promise<Product>' 형식에 할당할 수 없습니다.'unknown' 형식은 'Product' 형식에 할당할 수 없습니다.ts(2769)types.d.ts(9, 89): 필요한 형식은 이 시그니처의 반환 형식에서 가져옵니다ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ'{}' 형식에 'Product' 형식의 id, imageUrl, price, title 외 2개 속성이 없습니다.ts(2740)detail.tsx(3, 77): 필요한 형식은 여기에서 'IntrinsicAttributes & { item: Product; }' 형식에 선언된 'item' 속성에서 가져옵니다.import { Product } from '../../graphql/products' const ProductDetail = ({ item: { title, imageUrl, description, price } }: { item: Product }) => ( <div className="product-detail"> <p className="product-detail__title">{title}</p> <img className="product-detail__image" src={imageUrl} /> <p className="product-detail__description">{description}</p> <span className="product-detail__price">${price}</span> </div> ) export default ProductDetailcomponents > products > detail.tsxpages > products > index.tsx이 호출과 일치하는 오버로드가 없습니다. ... 필요한 형식은 이 시그니처의 반환 형식에서 가져옵니다(위와 동일)'NonNullable<TQueryFnData>' 형식에 'products' 속성이 없습니다'product' 매개 변수에는 암시적으로 'any' 형식이 포함됩니다 해당 에러는 앞서 다른 수강생들도 질문한 부분이라 찾아봤는데const { data } = useQuery<Products>(QueryKeys.PRODUCTS, () => graphqlFetcher<Products>(GET_PRODUCTS) ) 알려주신 방식대로 리액트쿼리 버전 변경에 따라 타입스크립트 정의 방식이 바뀐 형태로 수정해주었는데도 같은 에러가 발생합니다.handlers.ts이 상태에서 실행을 하니 data객체가 정의되지 않는다고 나오며 localhost 500 Request Handler Error가 뜹니다import { gql } from 'graphql-tag' export type Product = { id: string imageUrl: string price: number title: string description: string createdAt: string } // export type MutableProduct = Omit<Product, 'id' | 'createdAt'> export type Products = { products: Product[] } const GET_PRODUCTS = gql` query GET_PRODUCTS { id imageUrl price title description createdAt } ` export const GET_PRODUCT = gql` query GET_PRODUCT($id: string) { id imageUrl price title description createdAt } `graphql > products.ts며칠째 계속 잡고 하다가 안되서 그냥 두고 다음 강의 듣고 있는 중인데 오류 때문에 자꾸 신경이 쓰이네요별거 아닌 에러였으면 좋겠네요
-
미해결Vue 3 & Firebase 10 커뮤니티 만들기 풀스택 - "활용편" (with Pinia, Quasar, Tiptap, VueUse)
vite로 프로젝트를 만들어서 진행해도 문제 없을까요?
안녕하세요~당연히 강의 내용을 따라가는게 맞긴 합니다만, 제가 백엔드 개발자라 인텔리제이 IDE를 쓰는게 편해서 강의를 인텔리제이로 진행중입니다vite로 프로젝트를 만들면 인텔리제이에서 뷰로 인식해서 여러 vscode에서 따로 설치해야하는 플러그인 기능을 기본으로 제공해주더군요근데 퀘이사로 프로젝트를 생성하면 이같은 기능이 동작하지 않네요 정리하자면 vite로 프로젝트를 만들어서 퀘이사를 설치해도 후반부 강의에 문제 없을까요?
-
해결됨[초중급편] 안드로이드 데이팅 앱 만들기(Android Kotlin)
초급용 미리보기 영상을 보며 따라하고 있습니다.
안녕하세요!1) 초급용 추천받아서 미리보기로 영상을 따라하고 있는데 영상과 다르게 'build configuration language'가 계속 뜨고2) 'android studio' 다운 받을 때 저는 'android studio giraffe'로 다운을 받았는데 이건 버전을 나누기 위해 다른 게 맞나요?
-
해결됨[초중급편] 안드로이드 데이팅 앱 만들기(Android Kotlin)
만든 후 activity_main.xml이 없습니다. MainActivity.kt의 로고도 이상합니다.
안녕하세요!위 화면에서 finish후 나오는 화면입니다.
-
해결됨[Bloc 응용] 실전 앱 만들기 (책 리뷰 앱) : SNS 로그인, Firebase 적용, Bloc 상태 관리, GoRouter
즐겨찾기 기능 질문 요청드립니다..
페이지 처음진입시 즐겨찾기 클릭하면정상적으로 별이 on 으로 바뀌게 되는데" 한번끄고 다시 키면 on으로 바뀌지않고 off 형태의 아이콘이되어있고 다시 뒤로갔다가 들어오면 정상적으로 on 으로 바껴있습니다 !!= 파이어베이스 db 상에는 데이터가 들어오지만상태가 바뀌지않아서 off 상태일때 10번누르면10번이 다 firebase db에 insert 되는현상이 나타납니다 ㅠㅠprofilePageactions: [ GestureDetector( onTap: () { var myUid = context.read<AuthenticationCubit>().state.user!.uid; context.read<UserProfileCubit>().followToggleEvent(myUid!); }, child: Padding( padding: const EdgeInsets.only(right: 20), child: BlocBuilder<UserProfileCubit,UserProfileState>( builder: (context,state) { var myUid = context.read<AuthenticationCubit>().state.user!.uid; var isFollowing = state.userModel?.followers?.contains(myUid) ?? false; return SvgPicture.asset(isFollowing ? 'assets/svg/icons/icon_follow_on.svg' :'assets/svg/icons/icon_follow_off.svg'); } ), ),user profile cubit void followToggleEvent(String myUid) async { if (state.userModel!.followers != null && state.userModel!.followers!.contains(myUid)) { // 즐겨찾기 취소 언팔 var result = await userRepository.followEvent(false,state.userModel!.uid!,myUid); if (result) { await _unfollow(myUid); } } else { // 즐겨 찾기 하기 var result = await userRepository.followEvent(true,state.userModel!.uid!, myUid); if (result) { await _follow(myUid); } } } _unfollow(myUid) async { emit( await state.copyWith( userModel: state.userModel!.copyWith( followers: List.unmodifiable( [...state.userModel!.followers!.where((targetUid) => targetUid != myUid)], ), ), ), ); } _follow(myUid) async { print(state.userModel!.followers); if (state.userModel!.followers == null) { // 최초 팔로워 대상 emit( await state.copyWith( userModel: state.userModel!.copyWith( followers: List.unmodifiable( [myUid], ), ), ), ); } else { // 다른사람이 이미 팔로워 한사람 emit( await state.copyWith( userModel: state.userModel!.copyWith( followers: List.unmodifiable( [ ...state.userModel!.followers!, uid ], ), ), ), ); } } }user-repositoryFuture<bool> followEvent(bool isFollow,String targetUid, String myUid) async { try { // 2 가지 업데이트 ( 트랜잭션 실행 필요 ) final batch = db.batch(); // Type1 . 상대방 팔로워에 내가 들어가는건다.. var targetUserDoc = await db.collection("users").where("uid", isEqualTo: targetUid).get(); UserModel targetUserInfo = UserModel.fromJson(targetUserDoc.docs.first.data()); var followers = targetUserInfo.followers ?? []; // 최초사람 if (isFollow) { followers.add(myUid); } else { followers.remove(myUid); } var targetRef = db.collection("users").doc(targetUserDoc.docs.first.id); batch.update(targetRef, {'followers': followers}); // Type1 . 내 팔로워에 상대방이 들어간다... var myUserDoc = await db.collection("users").where("uid", isEqualTo: myUid).get(); UserModel myUserInfo = UserModel.fromJson(myUserDoc.docs.first.data()); var followings = myUserInfo.followings ?? []; if (isFollow) { followings.add(targetUid); } else { followings.remove(targetUid); } var MyRef = db.collection("users").doc(myUserDoc.docs.first.id); batch.update(MyRef, {'followings': followings}); await batch.commit(); return true; } catch (e) { return false; } }
-
해결됨[Bloc 응용] 실전 앱 만들기 (책 리뷰 앱) : SNS 로그인, Firebase 적용, Bloc 상태 관리, GoRouter
리뷰작성 별점 문의
안녕하세요 개남님!! 다름이아니라 리뷰작성페이지에서 별점을 올려놓고 리뷰 입력할려고 텍스트 필드를 클릭하고 나면 별점이 0.00 으로 다시 되돌아가고 있습니다. 그리고 save 저장할대 값은 5.44 대로 잘 들어오고 있는 현상이 나타납니다 ㅠ..ㅠ리뷰 슬라이드바는 공유 해주신 dart 파일 그대로 사용하였구용 import 'package:book1/src/common/components/app_divider.dart'; import 'package:book1/src/common/components/review_slider_bar.dart'; import 'package:book1/src/common/model/naver_book_info.dart'; import 'package:book1/src/review/cubit/review_cubit.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_svg/svg.dart'; import 'package:go_router/go_router.dart'; import '../../common/components/app_font.dart'; import '../../common/components/btn.dart'; class ReviewPage extends StatelessWidget { NaverBookInfo naverBookInfo; ReviewPage(this.naverBookInfo, {super.key}); @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( leading: GestureDetector( onTap: context.pop, child: Padding( padding: const EdgeInsets.all(15.0), child: SvgPicture.asset('assets/svg/icons/icon_arrow_back.svg'), ), ), title: AppFont( "리뷰 작성", size: 18, ), centerTitle: true, ), body: Column( children: [ _HeaderBookInfo(naverBookInfo), AppDivider(), Expanded(child: _ReviewBox()), ], ), bottomNavigationBar: Padding( padding: EdgeInsets.only( left: 20, right: 20, top: 20, bottom: 20 + MediaQuery.of(context).padding.bottom), child: Btn( onTap: context.read<ReviewCubit>().save, text: '저장', ), ), ); } } class _ReviewBox extends StatelessWidget { _ReviewBox({super.key}); @override Widget build(BuildContext context) { return TextField( // 전체화면 텍스트필드 maxLines: null, decoration: const InputDecoration( border: InputBorder.none, hintText: "리뷰를 입력해주세요", contentPadding: EdgeInsets.symmetric(horizontal: 25), hintStyle: TextStyle( color: Color(0xff585858), ), ), onChanged: context.read<ReviewCubit>().changeReview, style: TextStyle(color: Colors.white), ); } } class _HeaderBookInfo extends StatelessWidget { final NaverBookInfo naverBookInfo; _HeaderBookInfo(this.naverBookInfo, {super.key}); @override Widget build(BuildContext context) { return Padding( padding: const EdgeInsets.all(25.0), child: Row( children: [ ClipRRect( borderRadius: BorderRadius.circular(7), child: SizedBox( width: 71, height: 106, child: Image.network( naverBookInfo.image ?? '', fit: BoxFit.fill, )), ), SizedBox( width: 15, ), Expanded( //어디 영역까지 사용할거냐 child: Column( crossAxisAlignment: CrossAxisAlignment.stretch, children: [ AppFont( naverBookInfo.title ?? '', size: 16, fontWeight: FontWeight.bold, ), SizedBox( height: 5, ), AppFont( naverBookInfo.author ?? '', size: 12, color: Color(0xff878787), ), SizedBox( height: 10, ), ReviewSliderBar( onChange: context.read<ReviewCubit>().changeValue, ), ], ), ) ], ), ); } }