묻고 답해요
156만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨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), ), ); } }
-
미해결Flutter 초입문 왕초보편
영상과 코드가 다르고 구현도 차이가 있습니다.
안녕하세요 강의 내용상으로는 stful을 입력시 이런 코드가 작성된다고 들었으나 제가 할때는 이런 화면이 나오더라구요 그래서 안드로이드스튜디오가 버전이 다른가 싶어서 3강 윈도우 세팅 영상을 다시 보니(강사님 영상에는 벌 모양이 나오고 제 pc에서는 캥거루가 나오더라구요) 제목은 플라밍고, 영상은 안드로이드스튜디오 2021.1.1.21 patch 1 버전이라고 하나... 구버전 받는 곳을 찾아서 확인 해보니 안드로이드스튜디오 2021.1.1.21 patch 1 버전도, 플라밍고도 두가지 모두 보이지 않습니다. 코드가 다르다보니 구현중 타이틀 구현이 안되서 어느부분에서 오류가 있나 찾아보기에도 불편함이 있습니다. 실제로 강의 내용 중 appbar 구현을 하는 부분에서도 영상에서는 앱바가 나오나 제가 구현 한 앱에서는 앱바는 나오지 않습니다. 해당 캡쳐본에는 안 나와 있으나 "홈" 글자를 넣는것까지는 구현 됩니다. 어떻게 해야할까요???
-
미해결Flutter 초입문 왕초보편
53. 입력버튼 validation
알려주신데로 코드 작성하면 어던 부분이 잘못되었는지 모르겠으나 정상 동작하지 않습니다. (입력 값 모두 입력 시 결과 화면으로 넘어가지 않음.)인터넷 찾아보고 아래 처럽 바꾸니 정상 동작하는데, 어떤 것이 잘못된 것인지 알려주시면 감사하겠습니다.동작 코드 if (_formKey.currentState!.validate()) { Navigator.push( context, MaterialPageRoute( builder: (context) => const ResultScreen( height: 175, weight: 1000, ), ), ); } 이상 코드(강의 내용 / 입력값중 빈곳이 있는 경우 결과 화면으로 이동) onPressed: () { if (_formKey.currentState?.validate() ?? false) { return; } Navigator.push( context, MaterialPageRoute( builder: (context) => const ResultScreen( height: 175, weight: 1000, ), ), ); }, 잘못된 곳 설명 부탁 드립니다.