묻고 답해요
141만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨Flutter로 SNS 앱 만들기
UI - State - Provider - Repository의 관계
안녕하세요. 기존에 제가 코딩할 때는 provider 파일에서 모든 동작, 상태변화를 한번에 처리했는데, 이 강좌에서는 이를 세분화하여 state, provider, repository 파일로 나눈 것 같습니다. 제가 초보여서 잘 모르겠지만, 플러터 업계에서는 이러한 작업패턴이 존재하는 것인가요? 정확한 명칭이 있나요? 제가 각 파일의 역할을 이해하지 못해서 구글링을 해봐도 원하는 답변을 찾을 수가 없어서 문의드립니다. 혹시 UI - State - Provider - Repository 관계를 개념적으로 설명해주시면 많은 도움 될 것 같습니다.
-
해결됨Flutter로 SNS 앱 만들기
firebase연동 에서 에러가 발생했어요.. 도움좀 부탁합니다
fierbase연동에 에러가 발생했어요.2번째 꺼 복사해서 실행 했는데 에러가 났어요.경로 문제인듯 한데요 모르겠습니다.
-
해결됨Flutter로 SNS 앱 만들기
저는 똑같이 다르네요.플러그인 설치편 보고있습니다
(사진)
-
해결됨Flutter로 SNS 앱 만들기
dart data class
dart data class 저는 없네요. 어떻게 진행하면 될까요
-
해결됨Flutter로 SNS 앱 만들기
직접 null일 경우를 작성한 경우
이렇게 직접적으로 null인 경우의 로직을 작성해주니깐 작동이 되긴 한데, Moo님처럼 그냥 isEqualTo만 사용해서는 여전히 안 되네요. 해결은 했지만 원인이 궁금합니다..!
-
해결됨Flutter로 SNS 앱 만들기
isEqualTo 부분
강의를 잘 따라오던 도중, feed_repository의 getFeedList함수에서 isEqualTo 부분(1분41초)에서 uid는 nullable이므로feedScreen에서는 자동으로 null값이 들어가면서 모든 게시물들을 띄워줄거라고 하셨는데, 말씀은 이해가 되지만현재 제 앱에서는 '게시물이 존재하지 않습니다.' 화면이 뜨네요. profile_screen에서는 잘 작동이 됩니다만, 혹시 feedScreen이나 feedProvider 부분에서 추가로 작성해줘야 하는 코드가 있을까요?
-
해결됨Flutter로 SNS 앱 만들기
firebase 관련오류
안녕하세요..사용자 인증 시 아래와 같은예외가 발생합니다. FirebaseAuthException ([firebase_auth/too-many-requests] We have blocked all requests from this device due to unusual activity. Try again later.) 여기저기 찾아봐도 이유를 모르겠습니다혹시, 이유를 아시면 답변 부탁드리겠습니다. 감사합니다.
-
해결됨Flutter로 SNS 앱 만들기
댓글 입력시 오류
안녕하세요 강의 잘 듣고 있습니다.강의에서 배운 내용을 토대로 다른 프로젝트에 적용하려 합니다. 그런데 댓글을 올릴 때 아래처럼 오류가 뜨는데 뭐가 문제일까요..?
-
해결됨Flutter로 SNS 앱 만들기
프로바이더 등록시 문제.
안녕하세요 강의 잘 듣고, 보고 있습니다<상태관리 등록후, 회원가입테스트 >코드 따라가던 중 첨부한 파일과 같은 오류가 발생하였습니다. 말그대로 클래스명을 변경하여, 우선 해결은 한거 같은데위와 같은 오류가 나는 원인 뭔지 궁금합니다. 감사합니다.
-
해결됨Flutter로 SNS 앱 만들기
깃 파일 받아서 바로 실행시켜보고 싶은데
깃 파일 받아서 바로 실행시켜보고 싶은데혹시 건드려야할 코드가 있을까요?
-
해결됨Flutter로 SNS 앱 만들기
회원가입화면
에뮬레이터를 실행하고 회원가입화면으로 보고 싶은데, main화면이 실행됩니다
-
해결됨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), }); } } 바쁘실 텐데 질문 읽어주셔서 감사합니다.
-
미해결Flutter 초입문 왕초보편
지도위에 이동 경로 스리기
지도위에 이동경로 그리는 부분에서새로운 경로가 그려지고 조금 있으면 경로가 지워 집니다. 이렇게 동작하는 것이 정상인가요?설명 중에는 그런 내용에 없어 문의 드립니다.
-
미해결
플러터 크롤링 질문 있습니다.
import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:http/http.dart' as http; import 'package:map/main.dart'; import 'package:html/dom.dart' as dom; import 'package:html/parser.dart' as parser; void main() async{ var uri = Uri.parse("https://maps.google.com/?cid=9824313016117606097"); http.Response response = await http.get(uri); dom.Document document = parser.parse(response.body); print(document.outerHtml); }이런 식으로 파싱을 하는데 나오는 결과물이null,null,[[\"VENUS_UGCS_REFERENCE\",\"CIHM0ogKEICAgID4zYaWIg||\",\"1\"],[\"UGCS_REFERENCE\",\"CIHM0ogKEICAgICo0KaMYQ||\",\"1\"]]],null,null,null,null,null,null,null,[\"0\",\"-8622431057591945519\"]],[\"AF1QipM0NUuMNxT19uXB5qiTmGjxV2G0GhA2ttjxU20Y\",null,null,null,null,null,[\"https://lh5.googleusercontent.com/p/AF1QipM0NUuMNxT19uXB5qiTmGjxV2G0GhA2ttjxU20Y\\u003dw150-h150-k-no-p\"],null,[[null,127.12812502658495,37.6524851777755],null,null,75],\"Qz5OZav0GvfK1e8P2t-VoAQ\",\"0ahUKEwjrocKs0rmCAxV3ZfUHHdpvBUQQzCcIxgEoBg\",[\"//www.google.com/local/imagery/report/?cb_client\\u003dmaps_sv이런식으로 나오는데 어디 부분이 잘못된건지 모르겠어요
-
해결됨Flutter로 SNS 앱 만들기
인증 메일 전송 / firebase storage에 프로필 이미지 저장 강의 질문
안녕하세요. 강의 잘 듣고 있습니다.인증 메일 전송 / firebase storage에 프로필 이미지 저장 강의에 대해서 질문이 있습니다.firebase storage에 파일이 잘 저장되기는 했으나, 이미지 파일로 저장되지 않았습니다.왜 이렇게 되는지 잘 모르겠습니다.바쁘실텐데 질문 읽어주셔서 감사합니다.
-
해결됨Flutter로 SNS 앱 만들기
상태관리 등록 후, 회원 가입 테스트 부분 에러
안녕하세요.좋은 강의 잘 듣고 있습니다. 다름이 아니라, 상태관리 등록 후, 회원 가입 테스트 부분에서 에러가 나서 질문 드립니다.package:firebase_auth_platform_interface/src/auth_provider.dartimport 되어 있다고 해서 지우려고 찾아 봤는데 위의 저런 package는 import 되어 있지 않습니다. 무슨 문제인지 모르겠습니다. 바쁘실 텐데 질문 읽어주셔서 감사합니다.
-
미해결Flutter 초입문 왕초보편
구글 맵 플랫폼
구글맵플랫폼 사용시 결제 계정을 등록하라고 합니다.무료로 사용하는 방법이 있는 지 문의 드립니다.
-
해결됨
플러터 함수 실행에 대해 질문있습니다
/// 마커 터치 동작과 아이콘 수정 Future<Marker> Function(Cluster<Place>) _markerBuilder(BuildContext context) => (cluster) async { return Marker( markerId: MarkerId(cluster.getId()), position: cluster.location, onTap: () async { cluster.items.forEach((element) { log("${element.plcaeId.toString()}"); }); log("${context} 컨텍스트"); await locationWidgetUtil.buildShowModalBottomSheet(context!); }, icon: await _locationUtil.getMarkerBitmap( cluster.isMultiple ? 125 : 77, text: cluster.isMultiple ? cluster.count.toString() : null), ); }; /// 근처 플레이스 검색해서 마커 겹치는 정도 컨트롤 Future<void> initClusterManager(double lat, double lng) async { List<Place> placeCluster = await _locationUtil.nearSearchPlace(LatLng(lat, lng)); log("${placeCluster.length} 길이입니다."); _clusterManager = ClusterManager<Place>(placeCluster, _updateMarkers, markerBuilder: _markerBuilder(_context!), levels: const [1, 4.25, 6.75, 8.25, 11, 14, 16, 17, 20.0]); log("${_clusterManager!.items.length}아이템 길이이므니다"); notifyListeners(); } /// 겹치는 마커 안겹치는 마커 다시 그리는 용도 void _updateMarkers(Set<Marker> markers) { _markerList = markers; notifyListeners(); }var pl = Provider.of<LocationNotifier>(context,listen: false); await pl.getPosition(); pl.setContext(context); await pl.initClusterManager(pl.current.latitude,pl.current.longitude);아래 코드에서 pl.initClusterManager를 실행하면 정상적으로 _markerBuilder가 잘 실행되면서 다음 페이지로 넘어가는데 다시 pl.initClusterManager를 호출하면 _markerBuilder에 로그를 넣어보니 로그가 아예 실행이 안되는데 처음할 때는 실행이 되는데 한 번 더 입력하면 실행이 안되는지 이유를 모르겠습니다. 위에 코드는 Provider쪽 파일입니다.
-
미해결Flutter 초입문 왕초보편
floatingActionButton 미출력 문의
영상의 코드와 다른게 보이지 않으나... (영상의 코드)(제가 작성 한 코드) 플로팅버튼도 보이지 않습니다.... 버튼이 보이지 않더라도 영상상 위치 지점을 클릭했을시 run 쪽에서 클릭 반응도 없구요... 그리고 아까 답변 감사히 보고 앱 바쪽에 backgroundColor: Colors.amber 선언도 했는데 앱바쪽 색상이 안 변합니다. 선언 한 위치가 문제였을까요....? 진짜 생초보라 번거롭게 만들어드리는것 같아서 죄송스럽네요.. 어느 부분이 틀린지 감도 안 잡혀 통채로 올려봅니다. import 'package:flutter/material.dart'; void main() { runApp(const MyApp()); } class MyApp extends StatelessWidget { const MyApp({super.key}); // This widget is the root of your application. @override Widget build(BuildContext context) { return MaterialApp( title: 'Flutter Demo', theme: ThemeData( colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple), useMaterial3: true, ), home: const MyHomePage(), ); } } class MyHomePage extends StatefulWidget { const MyHomePage({super.key}); @override State<MyHomePage> createState() => _MyHomePageState(); } class _MyHomePageState extends State<MyHomePage> { @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text('홈'), backgroundColor: Colors.amber), body: Center( child: Text( '0', style: TextStyle(color: Colors.red, fontSize: 70), ), ), floatingActionButton: FloatingActionButton( onPressed: () { print('클릭'); }, child: Icon(Icons.add), ), ); } }