[코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!
안녕하세요. WebView 실행 시 시뮬레이터가 빈화면으로만 나옵니다. 그래서 블로그 말고 m.naver.com으로 하면 네이버 화면은 나오는데, 블로그만 뜨질 않습니다. 구글링을 해서 플러그인도 써보았지만 안되서 방안을 요청드립니다. 해결방안이 있을까요? 원격지원도 가능하실까요?
안녕하세요. 강의를 따라 오던 중 복수의 이미지 리스트 List<String>으로 업로드하고 또 읽어올 수 있을지 궁금증이 생겨 테스트를 하던 중 도저히 해결되지 않은 문제가 있어 질문 올립니다.(업로드는 성공했습니다.) 현재 강의 코드에서 imageUrl 만 String 에서 List<String> 으로 바꿔 아래와 같이 수정했습니다. class Post { String id; String userId; String title; List<String> imageUrls; Post({ required this.id, required this.userId, required this.title, required this.imageUrls, }); factory Post.fromJson(Map<String, dynamic> json) { return Post( id: json['id'] as String, userId: json['userId'] as String, title: json['title'] as String, imageUrls: json['imageUrls'] as List<String>, ); } Map<String, dynamic> toJson() { return { 'id': id, 'userId': userId, 'title': title, 'imageUrls': imageUrls, }; } } 여기까진 문제가 없었는데, firestore에서 데이터를 불러와 List<Post>로 가공하는 부분에서 아래와 같이 에러가 발생하고 있습니다. List<Post> posts = snapshot.data!.docs.map((el) => el.data()).toList(); // type 'List<dynamic>' is not a subtype of type 'List<String>' in type cast 다음처럼 fromJson 함수를 수정해보려 했는데 해결되지 않아 질문합니다 ㅠㅠ 해결 방법이 있을까요?? import 'dart:convert'; // ... class Post { // ... factory Post.fromJson(Map<String, dynamic> jsonData) { final imageUrls = json.decode(jsonData['imageUrls']).cast<String>().toList(); return Post( id: jsonData['id'] as String, userId: jsonData['userId'] as String, title: jsonData['title'] as String, imageUrls: imageUrls, ); } (위와 같이 수정하면 type 'List<dynamic>' is not a subtype of type 'String' 이런 에러 메세지가 뜹니다.
[코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!
OOP 강의에서 상속 공부하던 중 의문이 생겨 질문 드립니다. void main() { print('-------------Idol-------------'); Idol apink = Idol(name: "에이핑크", members_count: 5); apink.say_name(); apink.say_members_count(); // apink.say_male(); - 이건 X print('-------------boy_group-------------'); boy_group bts = boy_group('bts',7); bts.say_name(); bts.say_members_count(); bts.say_male(); print('-------------girl_group-------------'); girl_group red_velvet = girl_group('Red Velvet',5); red_velvet.say_name(); red_velvet.say_members_count(); red_velvet.say_female(); print('-------------type_comparison-------------'); print(apink is Idol); print(apink is boy_group); print(apink is girl_group); print('-------------type_comparison2-------------'); print(bts is Idol); print(bts is boy_group); print(bts is girl_group); print('-------------type_comparison3-------------'); print(red_velvet is Idol); print(red_velvet is boy_group); print(red_velvet is girl_group); } // 상속 - inheritance // // 상속을 받으면, 부모 클래스의 모든 속성을 자식 클래스가 부여받는다. class Idol { //이름 String name; //멤버 숫자 int members_count; Idol({ required this.name, required this.members_count, }); void say_name() { print("저는 ${this.name}입니다."); } void say_members_count() { print("${this.name}은 ${this.members_count}명의 멤버가 있습니다."); } } // super가 부모를 의미하는! class boy_group extends Idol { boy_group( String name, int members_count, ) : super( name: name, members_count: members_count, ); // 밑의 super(~~) 이것이 Idol(~~) 을 의미하는 것임! 즉, 부모의 constructor 의미하는 것! void say_male(){ print("저는 남자아이돌입니다"); } } class girl_group extends Idol { girl_group( String name, int members_count, ) : super( name: name, members_count: members_count, ); // 밑의 super(~~) 이것이 Idol(~~) 을 의미하는 것임! 즉, 부모의 constructor 의미하는 것! void say_female(){ print("저는 여자아이돌입니다"); } } 여기에서는 name : name을 함으로써, 자식 class에서 받은 name을 부모 class의 name으로 복사해준다/넣어준다고 하셨는데, 그 다음 코드 void main() { TimesTwo tt = new TimesTwo(2); print(tt.calculate()); TimesFour tf = new TimesFour(2); print(tf.calculate()); } // method : function인데, class 내부에 있는! // override - 재정의 (우선시하다. 덮어쓰다) class TimesTwo { final int number; TimesTwo( this.number, ); //method int calculate() { return number * 2; } } class TimesFour extends TimesTwo { TimesFour( int number, ) : super(number); // @override //생략해도 되는데, 예의상 기입한다. int calculate() { // return super.number * 4; return super.calculate() * 2; // 이것도 가능! } } 이 내용을 보면, 부모class는 그냥 number인 것이 왜 그런 것이지 잘 이해가 안 됩니다. number:number가 아닌 이유가 어떤 것일까요?? named(required)의 여부가 이를 결정한 것일까요??
[코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!
flutter doctor 실행 했을때 이렇게 나옵니다. 2번째꺼는 저기서 말한 가이드 대로 flutter doctor --android-licenses 이렇게 나와요...ㅠㅠㅠ 그리고 마지막 [!] Android Studio (version 2022.1) ✗ Unable to find bundled Java version. 이부분은 어떻게 해결해야할지 모르겠습니다. ㅠㅠㅠㅠ
[코드팩토리] [중급] Flutter 진짜 실전! 상태관리, 캐시관리, Code Generation, GoRouter, 인증로직 등 중수가 되기 위한 필수 스킬들!
안녕하세요 상태관리 라이브러리 관하여 여쭤볼게 있습니다. 상태관리 라이브러리가 많은데 그중 riverpod을 쓰시는 이유가 있으신가요? 다른 상태관리 라이브러리 (Provider, Bloc, Get 등)을 사용해도 강의에 나온것과 같은 기능, 같은 패턴으로 구현할수 있나요?
[코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!
Idol blackpink = new Idol( ~~~ ) Idol blackpink = Idol( ~~ ) 이렇게 둘 다 가능하다는 내용을 보았습니다. const생성자를 적용시킬 경우, 후자는 const Idol( )을 하면 error가 발생하지 않는데, 전자의 경우에는 new const Idol( ) 을 해도, const new Idol()을 해도 error가발생하는데 어떻게 해야 할까요? 후자의 경우에는?
[코드팩토리] [중급] Flutter 진짜 실전! 상태관리, 캐시관리, Code Generation, GoRouter, 인증로직 등 중수가 되기 위한 필수 스킬들!
죄송하지만, 어제 질문을 남겼는데 제가 제대로 궁금한 사항을 전달하지 못한 거 같아 다시 질문드립니다. paginate함수에서 왜 꼭 final pState = state as CursorPaginationFetchingMore<T>; 해주어야만 하는지 잘 이해를 못하겠습니다. 강의에서 처럼, final resp = await repository.paginate(paginationParams: paginationParams); if (state is CursorPaginationFetchingMore) { final pState = state as CursorPaginationFetchingMore<T>; // 기존 데이터에 새로운 데이터 추가 state = resp.copyWith( data: [ ...pState.data, ...resp.data, ], ); 이 아닌, final resp = await repository.paginate(paginationParams: paginationParams); if (state is CursorPaginationFetchingMore) { state as CursorPaginationFetchingMore<T>; // 기존 데이터에 새로운 데이터 추가 state = resp.copyWith( data: [ ...state.data, ...resp.data, ], ); 으로 하게 되면 왜 data가 자동완성이 안되는 걸까요? state의 상태를 CursorPaginationBase로만 인식을 해서 안되던데, CursorPaginationFetchingMore extends CursorPaginationBase를 했으니, state as CursorPagination<T>이라고 해도 .data를 인식해야 하는거 아닌가요?
[코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!
안녕하세요, 선생님. 기초적인 것 같은데 이해되지 않는 부분이 있어 질문드립니다. 다트 공식문서상에 있는 예제입니다. void main(){ print(createOrderMessage()); } String createOrderMessage() { var order = fetchUserOrder(); return 'Your order is $order'; } Future<String> fetchUserOrder() async { return await Future.delayed(const Duration(seconds: 2), () => 'Large Latte'); } 결과: Your order is Instance of 'Future<String>' 로직적으로 해석를 시도해보았고 다른 예제들도 실행하면 잘 되는데..이 예제만 궂이 main함수에 Future를 집어 넣어주야 'Large Latte'를 받을 수 있다는게 ....기본 강의를 돌려보아도 이해가 되지 않는데...좀 상세히 설명 해 주실 수 있을까요?
[코드팩토리] [중급] Flutter 진짜 실전! 상태관리, 캐시관리, Code Generation, GoRouter, 인증로직 등 중수가 되기 위한 필수 스킬들!
paginate 함수에서, final pState = state as CursorPagination 하는 분에서요, state as CursorPagination 하면 state.data라고 자동완성이 안되던데 왜 그런가요? 데이터타입을 CursorPaginationBase로만 인식하던데 as CursorPagination을하면 확실한 다운캐스팅에선 data가 인식 되어야 맞는거 아닌가요?
[코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!
어떡해야 하나요? ㅠ 인터넷보고 ~/.zshrc 파일을 수정도 해봤는데 안되네요 - 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 코드팩토리 디스코드 https://bit.ly/3HzRzUM Flutter 강의를 구매하시면 코드팩토리 디스코드 서버 플러터 프리미엄 채널에 들어오실 수 있습니다! 디스코드 서버에 들어오시고 저에게 메세지로 강의를 구매하신 이메일을 보내주시면 프리미엄 채널에 등록해드려요! 프리미엄 채널에 들어오시면 모든 질의응답 최우선으로 답변해드립니다!
[코드팩토리] [중급] Flutter 진짜 실전! 상태관리, 캐시관리, Code Generation, GoRouter, 인증로직 등 중수가 되기 위한 필수 스킬들!
AuthRepository 클래스에서 token() 함수는 전혀 호출되지 않는거 같은데, Dead Code인가요? (Dead Code가 아니라면, 어디서 호출 되는지 설명 부탁드립니다) Dead Code 가 맞다면, 아래 2개 파일도 필요가 없어서 삭제해도 되는 걸까요? token_response.dart token_response.g.dart