묻고 답해요
121만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결Flutter로 SNS 앱 만들기
회원가입화면
에뮬레이터를 실행하고 회원가입화면으로 보고 싶은데, main화면이 실행됩니다
-
미해결[초급편] 안드로이드 커뮤니티 앱 만들기(Android Kotlin)
게시글/댓글 작성 후 리스트뷰에 즉시 반영이 안됩니다
안녕하세요 강사님좋은 강의 제공해주셔서 감사합니다.제목 그대로의 문제가 있어서 질문 남깁니다.BoardWrite액티비티에서 게시글 작성 후 등록 버튼을 누르고 finish()를 통해 프래그먼트로 빠져나오는 경우,그리고 BoardInside액티비티에서 댓글을 등록한 경우리스트뷰에 결과가 즉시 반영되지 않는 것 같습니다.다른 액티비티 혹은 프래그먼트로 이동 후 돌아오면 반영되긴 하지만요...강사님 영상을 보니 게시글/댓글 모두 리스트뷰에 즉시 반영되는 것 같은데...아, 차이점이 있다면 저는 binding을 쓰지 않았습니다. 혹시 이 탓일까요?
-
미해결Vue 3 & Firebase 10 커뮤니티 만들기 풀스택 (with Pinia, Quasar, Tiptap, VueUse)
비밀번호 재설정에서 질문있습니다!
안녕하세요, 파이어베이스 인증 부분'비밀번호 변경하기' 강의에서 궁금한 것이 있어 질문드립니다. 비밀번호 재설정을 위해 이메일로 재설정 링크를 발송하고재설정할 비밀번호를 입력하면이 창이 뜨는데, 여기서 저는 비밀번호 재설정 후 바로 제가 원하는 로그인화면으로 나왔으면 좋겠습니다. 상기의 화면은 제가 생성한 파일이 아니라firebase에서 보여주는 화면인데,그 부분은 어떻게 해야할까요, 그럼 확인부탁드리겠습니다감사합니다!
-
미해결vue.js 실전 프로젝트(트위터 클론)
배포 후 로그인 불가 현상
6월에 완성하고 파이어베이스 배포했을때는 정상적으로 작동을 했었는데 오늘 확인차 로그인을 해보려고 하니 이런 에러 메세지가 뜨면서 로그인 자체가 되질 않네요. 이전에 저장됐던 로그인 정보 파이어베이스 db에서 모두 삭제하고 새로 회원가입 후 로그인 했을때 현상입니다,.. 다른 아이디로 회원가입하고 로그인해도 똑같은 현상이 발생하네요.
-
미해결틴더 파이어베이스 클론 | 리액트 네이티브
강의 듣지마세요 환불!
해당 강의는 22년 3월에 만들어진 강의고, SDK 46 버전 이전 버전으로 빌드하셨지만,현재 23년 11월 기준, SDK 버전은 49입니다.따라서 expo에서 구글 인증, 구글 애드몹 등 지원을 안합니다.그럼 해당 강의가 의미가 없어져 버립니다. 열심히 수업듣는 중에 오류가 계속나서 해결방법을 찾아도 안나오고, 강사님은 어디가셨는지 피드백도 없고,별로 도움안되는 인프런 AI인턴이 답변만 하고, 따라서 정당하게 환불을 요청할 계획입니다.
-
해결됨풀스택 리액트 라이브코딩 - 간단한 쇼핑몰 만들기
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, ), ], ), ) ], ), ); } }
-
미해결[왕초보편] 앱 8개를 만들면서 배우는 안드로이드 코틀린(Android Kotlin)
람다 함수 중복 문제가 발생했는대 해결을 못하고있습니다.
명언 앱 마지막 부분에서 컴파일을 실행하면 발생하는 오류가 있습니다. Type com.cho.goodwards.MainActivity$$ExternalSyntheticLambda0 is defined multiple times: /Users/mac/Desktop/개인공부/Kotlin_ex/ex.5/app/build/intermediates/project_dex_archive/debug/out/com/cho/goodwards/MainActivity 2.dex, /Users/mac/Desktop/개인공부/Kotlin_ex/ex.5/app/build/intermediates/project_dex_archive/debug/out/com/cho/goodwards/MainActivity.dex 예제 파일을 받아 복붙해도 똑같이 오류가 발생합니다. gpt 에 질문 하니 binding = DataBindingUtil.setContentView(this, R.layout.activity_main) binding.showAllSentenceBtn.setOnClickListener { val intent = Intent(this, SentenceActivity::class.java) startActivity(intent) } binding.goodWordTextArea.setText(sentenceList.random()) } 이부분에서 문제가 생긴다고 하는대 안드로이드 처음이라 오류 찾는게 좀 힘듭니다. 구글링에서도 그래들 빌드 설정을 바꿔라는대 제가 잘못 수정했는지 오류가 여전히 걸리더군요
-
미해결[초중급편] 안드로이드 데이팅 앱 만들기(Android Kotlin)
매칭리스트를 눌러도 아무 반응이 없어요
계정 여러개 생성하여 서로 매칭을 시켜 알람까지 갔는데 MY MATCHING LIST를 눌러도 아무 반응이 없네요 어디가 문제인지 봐주실 수 있을까요?전체코드 깃허브 주소 -https://github.com/alsxm4625/sogating4/commit/e1307ce30381e77d678b715b3227f2e1a00d9a09
-
해결됨[Bloc 응용] 실전 앱 만들기 (책 리뷰 앱) : SNS 로그인, Firebase 적용, Bloc 상태 관리, GoRouter
플러터 바탕화면 빠진후 앱 진행시
안녕하세요 . 섹션7의 검색 라우터를 진행하다가 우연히 바탕화면에 들어갔다가 앱마크를 재생버튼이 아닌앱 마크를 클릭을 했더니 splash 화면에서 로딩중으로만 계속 되어있고print를 찍었더니 아예 App()에 있는 Gorouter 자체를 타지를 않는 현상이 생기고 있습니다.혹시 바탕화면 갔다가 다시 홈페이지 화면으로 들어가려고 하는데방법이 있을까 해서 글을 작성드렸습니다. 감사합니다 ㅠㅠ
-
미해결틴더 파이어베이스 클론 | 리액트 네이티브
더이상 학습 진행이 안됨...
FB) 파이어 베이스 로그인 (2) - Google Auth 여기서부터 진행이 안되는데 화면에서 혹시 빼먹은 부분이 있는게 아닌가 생각이 듭니다.
-
해결됨Flutter로 SNS 앱 만들기
접속중인 사용자의 정보 가져오기 강의 관련 질문
안녕하세요.강의 잘 듣고 있습니다.접속중인 사용자의 정보 가져오기 강의 관련 질문 있습니다.아래와 같이 영상과 같이 코딩했는데 빨간 줄이 지워지지 않습니다.Future<UserModel> 로 함수 정의를 했는데 빨간 줄이 지워지지 않습니다.무슨 문제인지 모르겠습니다. 바쁘신데 질문 읽어주셔서 감사합니다.
-
해결됨Flutter로 SNS 앱 만들기
사용자 정보, 게시글 정보를 Model 클래스로 관리 강의 관련 질문
안녕하세요.강의 잘 듣고 있습니다.사용자 정보, 게시글 정보를 Model 클래스로 관리 강의 관련 질문 있습니다.그 전 강의인 firestore에 게시글 정보 저장 강의 까지는 firestore database에 정상적으로 data가 올라갔습니다.하지만, 사용자 정보, 게시글정보를 Model 클래스로 관리 강의에 따라 코드 작성 후firestore database에 data가 올라가지 않습니다.(storage는 잘 작동합니다.)//feed_model.dart // ignore_for_file: public_member_api_docs, sort_constructors_first import 'dart:convert'; import 'package:cloud_firestore/cloud_firestore.dart'; import 'package:collection/collection.dart'; import 'package:sns_clonecode/models/urser_model.dart'; class FeedModel { final String uid; final String feedId; final String desc; final List<String> imageUrls; final List<String> likes; final int commentCount; final int likeCount; final Timestamp creatAt; final UserModel writer; const FeedModel({ required this.uid, required this.feedId, required this.desc, required this.imageUrls, required this.likes, required this.commentCount, required this.likeCount, required this.creatAt, required this.writer, }); Map<String, dynamic> toMap({ required DocumentReference<Map<String, dynamic>> userDocRef, }) { return { 'uid': this.uid, 'feedId': this.feedId, 'desc': this.desc, 'imageUrls': this.imageUrls, 'likes': this.likes, 'commentCount': this.commentCount, 'likeCount': this.likeCount, 'creatAt': this.creatAt, 'writer': userDocRef, }; } factory FeedModel.fromMap(Map<String, dynamic> map) { return FeedModel( uid: map['uid'], feedId: map['feedId'], desc: map['desc'], imageUrls: List<String>.from((map['imageUrls'])), likes: List<String>.from((map['likes'])), commentCount: map['commentCount'], likeCount: map['likeCount'], creatAt: map['creatAt'], writer: map['writer'], ); } } //user_model.dart // ignore_for_file: public_member_api_docs, sort_constructors_first import 'dart:convert'; class UserModel { final String uid; final String name; final String email; final String? profileImage; final int feedCount; final List<String> followers; final List<String> following; final List<String> likes; const UserModel({ required this.uid, required this.name, required this.email, required this.profileImage, required this.feedCount, required this.followers, required this.following, required this.likes, }); factory UserModel.init() { return UserModel( uid: '', name: '', email: '', profileImage: null, feedCount: 0, followers: [], following: [], likes: [], ); } //usermodle 이 가지고 있는 filed 변수로 가지고 있는 데이터들을 가지고 map 형태 데이터를 만들어 준다. Map<String, dynamic> toMap() { return { 'uid': this.uid, 'name': this.name, 'email': this.email, 'profileImage': this.profileImage, 'feedCount': this.feedCount, 'followers': this.followers, 'following': this.following, 'likes': this.likes, }; } //map 형태 데이터를 인자값을 전달 받아 usermolde 객체를 만들어 준다. factory UserModel.fromMap(Map<String, dynamic> map) { return UserModel( uid: map['uid'], name: map['name'], email: map['email'], profileImage: map['profileImage'], feedCount: map['feedCount'], followers: List<String>.from(map['followers']), following: List<String>.from(map['following']), likes: List<String>.from(map['likes']), ); } } //feed_repository.dart import 'dart:io'; import 'package:cloud_firestore/cloud_firestore.dart'; import 'package:firebase_storage/firebase_storage.dart'; import 'package:sns_clonecode/models/feed_model.dart'; import 'package:sns_clonecode/models/urser_model.dart'; import 'package:sns_clonecode/utils/logger.dart'; import 'package:uuid/uuid.dart'; class FeedRepository { final FirebaseStorage firebaseStorage; final FirebaseFirestore firebaseFirestore; const FeedRepository({ required this.firebaseFirestore, required this.firebaseStorage, }); Future<void> uploadFeed({ required List<String> files, required String desc, required String uid, //feeds 컬렉션에 저장 //피드 각각이 문서 //이미지는 storage에 직접 저장하고 firestore에 접근할 수 있는 url 문자열로 받을 것이다. //좋아요 수 //이 게시글에 달린 댓글의 수 //게시글을 작성한 날짜 //feeds에서 user의 정보를 바로 가져올 수 있게 reference 타입의 데이터를 저장한다. }) async { //파이어스토어에 데이터 저장하기위해서 //문서 아이디는 겹치지 않는 고유한 값으로 만들어야 한다. //a-z 알파벳 //0~9 숫자 //이 두가지를 조합해서 32글자의 고유한 값을 만들어 준다. //32글자에 - 4개씩 들어가서 36글자가 된다. //고유한 값을 만드는 방법 여러가지 version1 .... //우리는 version1을 사용 (현재 시간을 기준으로 random값을 만들어 준다.) String feedId = Uuid().v1(); //firestore 문서 참조 DocumentReference<Map<String, dynamic>> feedDocRef = firebaseFirestore.collection('feeds').doc(feedId); DocumentReference<Map<String, dynamic>> userDocRef = firebaseFirestore.collection('users').doc(uid); //storage 참조 Reference ref = firebaseStorage.ref().child('feeds').child(feedId); List<String> imageUrls = await Future.wait(files.map((e) async { //문자열 e는 이미지 파일에 접근할 수 있는 경로 String imageId = Uuid().v1(); TaskSnapshot taskSnapshot = await ref.child(imageId).putFile(File(e)); return await taskSnapshot.ref.getDownloadURL(); }).toList()); DocumentSnapshot<Map<String, dynamic>> userSnapshot = await userDocRef.get(); UserModel userModel = UserModel.fromMap(userSnapshot.data()!); FeedModel feedModel = FeedModel.fromMap({ 'uid': uid, 'feedId': feedId, 'desc': desc, 'imageUrls': imageUrls, 'likes': [], 'likeCount': 0, 'commentCount': 0, 'createAt': Timestamp.now(), 'writer': userModel, }); await feedDocRef.set(feedModel.toMap(userDocRef: userDocRef)); // await feedDocRef.set({ // 'uid': uid, // 'feedId': feedId, // 'desc': desc, // 'imageUrls': imageUrls, // 'likes': [], // 'commentCount': 0, // 'likeCount': 0, // 'creatAt': Timestamp.now(), // 'writer': userDocRef, // }); await userDocRef.update({ 'feedCount': FieldValue.increment(1), }); } } 바쁘실 텐데 질문 읽어주셔서 감사합니다.
-
미해결따라하며 배우는 리액트, 파이어베이스 - 채팅 어플리케이션 만들기
회원가입 유효성 부분 페이지 안뜨는 이유 좀요....
import React ,{useRef}from 'react' import { Link } from 'react-router-dom' import {useForm} from 'react-hook-form' function RegisterPage() { const {register,watch,errors} = useForm() const password = useRef(); console.log(watch("email")) return ( <div className='auth-wrapper'> <div style={{textAlign:'center'}}> <h3>Register</h3> </div> <form> <label>Email</label> <input name="email" type='email' // ref={register({ required: true, pattern: /^[0-9a-zA-Z]([-_._]?[0-9a-zA-Z])*@[0-9a-zA-Z]([-_._]?[0-9a-zA-Z])*\.[a-zA-Z]{2,3}$/i })} /> {/* {errors.email && <p>This field is required</p>} */} <label>Name</label> <input name="name" // ref={register({ required: true, maxLength: 10 })} /> {/* {errors.name && errors.name.type ==="requirerd" && <p>This field is required</p>} {errors.name && errors.name.type ==="maxLength" && <p>This input exceed maximum length</p>} */} <label>Password</label> <input name="password" type='password' // ref={register({required: true, minLength:6})} /> {/* {errors.password &&errors.password && errors.password.type ==="required" && <p>This name field is required</p>} {errors.password &&errors.password && errors.password.type ==="minLength" && <p>비밀번호 자리가 6자리 이상이어야 합니다.</p>} */} <label>Password Confirm</label> <input name="Password Confirm" type='password' // ref={register({ // required:true, // validate:(value)=> // value === password.current // })} /> {/* {errors.password_confirm && errors.password_confirm.type ==="required" && <p>This password confirm field is required</p>} {errors.password_confirm && errors.password_confirm.type ==="validate" && <p>This passwords do not match</p>} */} <input type="submit" /> <Link style={{color:'gray',textDecoration:'none'}}to="/login" >이미 아이디가 있다면</Link> </form> </div> ) } export default RegisterPage 이렇게 저 부분을 주석처리하면 회원가입 페이지가 나오는데 주석처리를 해제하면 회원가입 페이지가 안떠요...
-
미해결[초급편] 안드로이드 커뮤니티 앱 만들기(Android Kotlin)
RecyclerView 생성 관련 질문 있습니다.
RecyclerView 를 만들어 , 아이템목록을 HomeFragment 화면에 띄우게 하려면, 어떻게 해야할까요? HomeFragment.xml에 recyclerview 를 추가하고 , ContentListActivity의 내용을 HomeFragment에 옮기고 , Adapter 연결또한 HomeFragment 와 연결해주면 가능한가요? 직접 해보니 잘 안돼서 질문드립니다.
-
미해결[왕초보편] 앱 8개를 만들면서 배우는 안드로이드 코틀린(Android Kotlin)
꺼짐 현상
질문 시 전체 프로젝트 코드를 깃허브/구글 드라이브에 올리신 후 링크를 공유해주시면좀 더 빠르게 도움드릴 수 있습니다.https://drive.google.com/file/d/1lNIdqkBgFYh9sKKKL9f9GDCkewtzB9p5/view?usp=sharing 그 전 강의 부터 안되긴 햇는데요 ( 사진 클릭을 하면 링크로 안넘어가지고 스크립트 활성화를 시키라고 해서webView.settings.javaScriptEnabled = true부분을 추가 했습니다.이렇게 수정햇더니 사진을 누르면 꺼집니다.그리고 다음강의 계속 진행햇는데회원가입부분에서 에뮬레이터가 꺼집니다.어느 부분이 잘못 되었는지 모르겠습니다.