월 24,200원
5개월 할부 시다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 미해결Flutter 중급 1편 - 클린 아키텍처
편집 기능에서 색상 설정 질문
viewModel.onEvent(AddEditNoteEvent.changeColor(widget.note!.color));initState에서 위의 코드를 넣어주었습니다. 하지만 initState에서 notifyListners()를 호출해서 그런지 state 오류가 발생합니다.제 머리로 생각할 수 있는 대안은changeColor에 파라미터로 isRebuild 라는 bool 값을 받아서기본 값을 true 해놓고, true일 때만 notifyListeners가 호출되게 하였습니다.이렇게 플래그를 주는게 좋은 방법일까요?아니면 다른 키워드 주실 수 있을까요?
- 미해결Flutter 중급 1편 - 클린 아키텍처
HomeViewModel 질문 드립니다.
HomeViewModel을 PhotoApiRepository 타입의 멤버 변수를 가지고 있는데 repository.fetch 하여서 [home_view_model_test] 파일에서 테스트하게 되는데,해당 파일 내에 await viewModel.fetch('apple'); 코드를 사용해서 http 통신을 하게 되는데요.HomeViewModel 내부에 fetch 메서드는final result = await repository.fetch(query); _photoStreamController.add(result);위와 같은 상태인데 repository.fetch는 그냥 abstract method 이잖아요? 그러면 메서드 내에 바디가 비어있는건데 어떻게 실행이 되는건가요? ㅠㅠ 이해가 잘 가지 않아서 질문 드립니다. 혹시 PixabayApi 클래서에서 PhotoApiRepository를 implements해서 그런건가요? 그러면 어떤 클래스가 implements를 한다면 어느 클래스든 PhotoApiRepository의 fetch 메서드가 호출 된다면 PixabayApi내의 fetch 메서드가 불리는 걸까요??혹시 그게 맞다면 PhotoApiRepository를 implements 한 클래스들은 서로 같은 메서드명을 가지면 안되는 것일까요?질문이 좀 우왕좌왕하는데 ㅠㅠ 죄송합니다.
- 미해결Flutter 중급 1편 - 클린 아키텍처
Static 메서드를 사용할 때
강의를 보고 프로젝트를 하다가 궁금증이 생겨 질문드립니다.data_source 에서 pixabay api를 관리해주고 있는데 만약 Static 함수를 사용하는 경우 필요한 곳에서 바로 Static 함수(인스턴스를 생성 안하는) 를 불러와야 하는지 의문이 생깁니다.예를 들어 FirebaseAuth.instance.currentUser 를 사용한다면 viewModel에서 바로 불러와서 써도 되는지, 혹은 firebase_api를 따로 만들어 repository에서 구현을 하여 전달을 viewModel까지 해줘야 하는지 궁금합니다. 추석 연휴 잘 보내시기 바랍니다. 감사합니다.
- 미해결Flutter 중급 1편 - 클린 아키텍처
build_runner를 하며 생성된 파일을 탐색창에서 안보이게 할 수 없을까요?
강사님 화면에서는 안보여서 깔끔해 보이네요.아 그리고 지식 함양에 많은 도움이 되고 있습니다.감사드립니다!
- 미해결Flutter 중급 1편 - 클린 아키텍처
한 화면에 필요한 기능 만큼 유즈케이스를 따로따로 만드나요? 아니면 한 유즈케이스 안에 여러 메서드들을 생성하나요?
이 예제는 검색하는 메서드 하나밖에 없어서 유즈케이스가 하나 밖에 없는데요. 만약 이 화면에 사진 업로드, 유해컨텐츠 신고하기 기능이 있다고 가정하면GetPhotoUseCase.dart / UploadPhotoUseCase.dart / ReportUseCase.dart 이렇게 각각 유즈케이스들을 만들어서 뷰모델이 사용할 수 있도록 해야하는지, 아니면 HomeViewUseCase.dart 이라는 하나의 유즈케이스 안에 각각의 메서드들을 넣어야 하는지 궁금합니다! 아니면 비슷한 레포지토리를 사용할 것 같은 유즈케이스들끼리 따로 모으는 게 좋을까요?
- 미해결Flutter 중급 1편 - 클린 아키텍처
색깔을 고정하려면
안녕하세요. 색 고정에 대한 질문을 드립니다. AddEditNoteScreen을 누를 때마다 roseBud로 할려고 하면(5:10) AddEditNoteScreen에 AddEditNoteViewModel을 전달해주는 방식이 맞나요?
- 미해결Flutter 중급 1편 - 클린 아키텍처
공통 정보들의 DI는 어떻게 구현하면 좋을까요?
1. 공통 정보 예를들어 앱 전체에서 필요한 로그인 정보가 있는데요. 이를 앱내 전 페이지들에서 사용이 필요할때가 많은데요 이러한 로그인과 같은 공통 정보들은 어떻게 저장을 하고.. 각 페이지에서는 매번 이 정보를 어떻게 꺼내 쓰면 좋을까요? 상위페이지에서 하위페이지로 로그인정보를 계속 전달해줄수는 없을듯하구요.. DI 객체 만들어주신것 내에 2. 다른 클래스에 의존하지 않는 Model? 여기에 넣어서 쓰는게 좋을지.. 2. 그리고 로그인 정보가 한번 조회하고 나서 계속 고정된 값이 아니라 예를들어 특정화면에서 내가 bookmark또는 좋아요..를 클릭하면 이 값이 로그인 정보에 속하다보니 업데이트를 하고 다시 조회를 해야 하는데..이런 경우는 어떻게 구현을 하면 좋을까요? 구체적인 코드가 아니더라도 참조할만한 레퍼런스가 있을지요? 3. 고급? 플러터 기능에 대한 강좌 오픈 계획은 없으신가요??
- 미해결Flutter 중급 1편 - 클린 아키텍처
클린 아키텍처에 대해
안녕하세요. 항상 친절한 답변 감사합니다. 이번 강의를 보다가 궁금증이 몇 개 생겨 질문드립니다. 1. Use Case가 MVC 패턴의(?) service와 비슷하다는 느낌을 받았는데 비슷한 개념인지 궁금합니다. 2. 기능에 따라 (강의에서는 5개(업데이트, 추가, 삭제 등)) class 별로 각자 구현하였는데 이 방식이 call 함수를 쓰기 위함인지 궁금합니다. MVC에서는 Service 계층에서 하나의 클래스 안에 필요한 메서드(Use Case)를 생성했었는데 기능 하나마다 클래스를 만드니 메모리면에서(큰 프로젝트에서는) 낭비가 되지 않나 싶습니다. 3. 모델이 여러개인 경우 use_case 안에 여러개의 모델 디렉토리를 만들어 그 모델 디렉토리 안에서 dart파일을 보통 관리하나요? 4. note_repository에서 추상클래스를 만들고, 그를 구현하는 NoteRepositoryImpl를 만들고, 구현한 그를 사용하는 db_helper를 또 만들었습니다. Impl과 helper를 합칠만하다고 생각하는데 따로 관리하는 이유가 궁금합니다.
- 미해결Flutter 중급 1편 - 클린 아키텍처
래퍼런스 참조로 인한 변경에 대해
래퍼런스로 접근하기 때문에 clear 등이 가능하여 UnmodifiableListView로 감싸준다는 것으로 이해 했습니다. 다트 특성상 예외를 던진다고 하셨는데 그렇다면 자바 같은 경우는 어떻게 처리를 하나요? 검색을 어떻게 해야할지 몰라 질문 남깁니다.
- 미해결Flutter 중급 1편 - 클린 아키텍처
Provider 설정 후 코드가 깨집니다.
Provider 설정 후, StreamBuilder의 stream: viewModel.photoStream에서 에러가 뜹니다. 타입이 안맞는다고 하여 StreamBuilder의 <List<Photo>> 타입 지정을 지우니 해결이 됐습니다. 타입을 안 지우고 해결할 수 있을까요?(StreamBuilder로 지정한 타입이 널 값이 가능한 <List<Photo>>라 타입 오류가 뜨는 것 같습니다.)
- 미해결Flutter 중급 1편 - 클린 아키텍처
photo.g.dart 파일이 생성되지 않습니다.
똑같이 했는데 코드 제네레이션이 동작을 안해서 유심히 살펴보니... Photo.dart 파일의 이름이 대문자 P로 시작하더군요. 이를 소문자 p로 바꾸니까 제대로 동작했습니다. 혹시 같은 문제로 고민하실 분이 있으실까 이렇게 글을 남기며, 강의자님께는 이렇게 되는 이유를 묻고 싶습니다.
- 미해결Flutter 중급 1편 - 클린 아키텍처
Mockito test를 하는 이유
Mock 가짜 객체를 만든다는 의미는 종속된 api 등에서 에러가 나거나 종속성을 제거를 하기 위한 단위 테스트를 위함 이라고 이해했는데 맞는걸까요? 오히려 1,2번 json data가 오류가 난게 api가 고장났다는 설정으로 가정한다면, 종속성을 제거하기 위해 mockito를 사용했다가 맞는건가요?
- 미해결Flutter 중급 1편 - 클린 아키텍처
photoStreamController.add(result)에 대해 문의드립니다.
테스트 코드 작성하고 나서 의문이 들어 질문드립니다. HomeModelView가 fetch를 할 때마다 photoStreamController에 리스트들을 추가 해주므로 페치한 횟수 -> 페치된 리스트 갯수 + 1개(null 리스트)만큼 photoStream에 저장 된다고 이해했습니다. 그럼 실제 메인코드 실행 후 검색을 할 때(fetch를 실행할 때) 처음 검색한 'apple' Photo 리스트가 스트림에 추가되고 그 다음에 검색한 'banana' Photo 리스트가 스트림에 추가가 되면 (apple Photo 리스트가 사리지지 않으므로) 그리드 뷰에 삭제되지 않은 apple Photo 리스트가 보여지지 않습니다. 이는 Stream 자체가 새로운 값을 리턴해주기 때문에 그런게 맞는지 궁금합니다. 또한 Stream에는 여전히 apple Photo가 남는게 맞는건가요? (이는 테스트 코드로 확인했으나 확실하게 넘어가고 싶습니다.) 요약하자면 fetch할 때마다 스트림에 추가가 되는데 전에 스트림에 담겨있던 사진들은 스트림에서 어떻게 관리가 되는지 궁금합니다.
- 미해결Flutter 중급 1편 - 클린 아키텍처
freezed Result 클래스 생성시 오류가 발생하여 문의 드립니다.
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 강의 버전과 다르게 작업 중이긴 하지만 도큐멘트도 큰차이가 보이지 않아진행했지만 오류가 발생하여 문의 드립니다. 확인 부탁드립니다. 감사합니다. ------- Flutter 3.1.0-0.0.pre.1506 • channel master • https://github.com/flutter/flutter.gitFramework • revision 4b5be42f2d (12 days ago) • 2022-07-05 18:39:08 -0400Engine • revision ed6adf55e0Tools • Dart 2.18.0 (build 2.18.0-256.0.dev) • DevTools 2.15.0 -------- 에러 로그 Marked Result with @freezed, but freezed has nothing to generatepackage:image_search/data/data_source/result.dart:6:16 ╷6 │ abstract class Result<T> with _$Result<T> { │ ^^^^^^ ╵ --------- 코드part 'result.freezed.dart';@freezedabstract class Result<T> with _$Result<T> { factory Result.success(T data) => Success; factory Result.error(String message) => Error;}
- 미해결Flutter 중급 1편 - 클린 아키텍처
viewmodel 생성자에서 파라미터를 받는법이 궁금해요..
안녕하세요. 강사님의 강의를 잘 듣고 알려주신 아키텍처 구조를 그대로 최대한 유지해서 앱을 개발하고 있는 1인입니다. 궁금한점이 있는데 강사님의 강의에서 viewmodel 생성자에서 loadNotes() 를 통해서 실제 note list 를 가져오고 있는데요. 여기서 note 보다 더 상위 개념이 noteGroup 이라는게 있고 특정 noteGroup에 속한 note list만을 조회하려고 할때 viewmodel에서 상위 noteGroup의 id를 가지고 notelist조회를 해야 하는데 noteGroup id를 viewmodel에 어떻게 전달할수 있을까요? note page 앞단에 note Group 페이지가 하나 더 있다고 가정하고 note Group에서 특정 note group을 클릭했을때 현재의 note list가 나오도록 구현을 하고 싶은 상황입니다. 아래 코드에서 _loadNotes() -> _loadNote(noteGroupid) 이렇게 호출을 하려고 하거든요.. 근데 noteGroupid를 viewmodel로 전달하는 방법을 모르겠습니다. ㅠㅠ NotesViewModel(this.useCases) { _loadNotes();} 항상 상세한 답변 미리 감사드립니다.
- 미해결Flutter 중급 1편 - 클린 아키텍처
NotesScreen 에서 선택한 note 의 color 가 AddEditNoteScreen 에 반영이 되고 있는건가요 ?
note 가 있는 경우 title 과 content 만 입력해주고 있어서 color 는 rosBud 로 전부 보이는것 같은데..(5:40) 제가 코드를 완전히 똑같게 실습하고 있지는 않아서 놓친게 있는건지 궁금합니다 ~
- 미해결Flutter 중급 1편 - 클린 아키텍처
리스트 페이지 refresh???
안녕하세요~~ 리스트 페이지의 refresh 를 구현하는 기능에 대해서 질문드릴께 있습니다. 현재 구현하신 방법은 리스트 페이지 -> 등록 페이지 이렇게 2개 페이지내에서 리스팅과 등록/업데이트를 하는구조라등록페이지에서 navigation.pop의 리턴값 true를 통해서리스트페이지에서 리스트의 reload를 하고 있는 방식인데요..혹시 리스트페이지 -> 등록페이지1 -> 등록페이지2 이런식의 구조라면 최종 등록페이지2에서 등록을 완료하고 나서 pop를 할수가 없고 이렇게 되면 리턴 true를 전달이 불가한데요..등록페이지2에서 등록 완료 이후 pop이 아닌 pushAndRemoveUntil 로 리스트페이지로 이동을 하게 될때리스트 페이지에서의 리스트 reload는 어떻게 구현을 해야 할까요? 등록페이지2에서 뭔가 flag 값을 전달해서 리스트페이지 오픈시 이 값을 가지고 reload를 해야 할지.. 아니면 가르쳐주신 방식에서 조금 더 응용을 할 수 있을지 궁금합니다.
- 미해결Flutter 중급 1편 - 클린 아키텍처
3강
3강의를 따라서 작성하면 아래의 소스의 하단에 photo부분에서 에러가 발생 하고 있습니다. 왜 에러가 발생하는지 이유를 잘 몰라 문의 드립니다. import 'dart:convert'; import 'package:flutter/material.dart';import 'package:image_search/model/Photo.dart';import 'package:image_search/ui/photo_widget.dart';import 'package:http/http.dart' as http;class HomeScreen extends StatefulWidget { const HomeScreen({Key? key}) : super(key: key); @override State<HomeScreen> createState() => _HomeScreenState();}class _HomeScreenState extends State<HomeScreen> { final _controller = TextEditingController(); List<Photo> _photos = []; Future<List<Photo>> fetch(String query) async { final response = await http.get(Uri.parse( 'https://pixabay.com/api/?key=27171919-dd7273ea4c33cde4e8cbd583f&q=$query&image_type=photo')); Map<String, dynamic> jsonResponse = jsonDecode(response.body); Iterable hits = jsonResponse['hits']; return hits.map((e) => Photo.fromJson(e)).toList(); } @override void dispose() { _controller.dispose(); super.dispose(); } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( centerTitle: true, title: const Text( '이미지 검색 앱', style: TextStyle(color: Colors.black), ), backgroundColor: Colors.white, elevation: 0.0, ), body: Column( children: [ Padding( padding: const EdgeInsets.all(16.0), child: TextField( controller: _controller, decoration: InputDecoration( border: const OutlineInputBorder( borderRadius: BorderRadius.all(Radius.circular(10.0)), ), suffixIcon: IconButton( onPressed: () async { final photos = await fetch(_controller.text); setState(() { _photos = photos; }); }, icon: const Icon(Icons.search), ), ), ), ), Expanded( child: GridView.builder( padding: const EdgeInsets.all(16.0), itemCount: _photos.length, gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount( crossAxisCount: 2, crossAxisSpacing: 16, mainAxisSpacing: 16, ), itemBuilder: (context, index) { final photo = _photos[index]; return PhotoWidget( photo: photo, <-- 이부분의 photo에서 에러가 발생 ); }, ), ) ], ), ); }}
- 미해결Flutter 중급 1편 - 클린 아키텍처
nested json에 대한 처리 및 테스트는 어떻게 해야 할까요? ㅠ
강의에서 가르쳐주신 방법데로 개인플젝에 테스트 코드를 만들어서 사용하고 있는데요.. 설계한 모델은 community, 그리고 이 안에 communitySetting을 담당하는 모델 2개를 만들어두었고 아래와 같이 freezed를 이용해서 구현을 해두었습니다. Community model (community setting 모델을 포함하는..) @freezedclass Community with _$Community { @JsonSerializable(fieldRename: FieldRename.snake, explicitToJson: true) const factory Community({ int? id, required String image, required String name, required String introduction, required int publicStatus, required String type, required String detailType, int? rank, String? zipcode, String? address, required int approveRequiredStatus, required String signupIntroduction, required CommunitySetting settingJson }) = _Community; factory Community.fromJson(Map<String, dynamic> json) => _$CommunityFromJson(json);} CommunitySetting 모델 @freezedclass CommunitySetting with _$CommunitySetting { @JsonSerializable(fieldRename: FieldRename.snake, explicitToJson: true) const factory CommunitySetting({ required String configName, required String fillPhone, required String fillGender, required String fillBirthDate, required String fillActivityArea, required String fillIntroduction, required String fillMotivationToJoin, }) = _CommunitySetting; factory CommunitySetting.fromJson(Map<String, dynamic> json) => _$CommunitySettingFromJson(json);} 그리고 test 코드에서는 fakeJson을 아래와 같이 nested json 있는 형태로 구성하고 테스트를 돌렸는데요 Nested Json은 setting_json 필드 입니다. String fakeJsonOne = """ { "id": 1, "image": "https://www.google.com/url?sa=i&url=https%3A%2F%2Fwww.facebook.com%2Fgroups%2F623067261102382%2F&psig=AOvVaw3ok-tVpjly7PZseHURwtWJ&ust=1647397226257000&source=images&cd=vfe&ved=0CAsQjRxqFwoTCIjvr4qHx_YCFQAAAAAdAAAAABAD", "name": "우리동네 커뮤니티", "introduction": "우리동네 오신걸 환영합니다.", "public_status": 1, "type": "OFFICIAL", "detail_type": "GNRL", "ranking": null, "zipcode": "112233", "address": "경기 양평군", "approve_required_status": 1, "signup_introduction": "가입인사 꼭 남겨주세요.", "setting_json": { "fillPhone": "OPTIONAL", "configName": "MANDATORY", "fillGender": "MANDATORY", "fillBirthDate": "NONE", "fillActivityArea": "OPTIONAL", "fillIntroduction": "OPTIONAL", "fillMotivationToJoin": "OPTIONAL" }}"""; type 'Null' is not a subtype of type 'String' in type cast 이런 에러가 계속 나면서 테스트가 계속 실패가 되고 있습니다. nestedJson으로 구성한 setting_json을 제대로 파싱을 못하는거 같은데 어느 부분을 확인을 해보면 될까요?
- 미해결Flutter 중급 1편 - 클린 아키텍처
textfield rich text 처리
안녕하세요. 강사님, 채팅앱을 구현중인데, 막히는게 있어 질문드리려고합니다! 카카오톡,페메처럼 textfield안에서 @닉네임 <--이부분을 파란색으로 만들어주고싶은데, 하루종일 구글링해봐도 flutter mentions, 뭐 이런 패키지들 말고는 마땅히 안보이더라구요. 위에 패키지들은 제가 원하는 기능들(태그지울떄 한번에 지워지는것 등)이 없어서 따로 구현하려하는데, textfield에 text를 regex로 묶어서 스타일주는 방법이 없을까요?? 그리고 @닉네임 이런식으로 묶여있는거는 백스페이스시 @닉네 이런식으로 말고 한방에 지울방법도 혹시 알고있으시다면 방법을 알려주시면 정말 감사하겠습니다.