월 24,200원
5개월 할부 시다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 미해결Flutter 중급 1편 - 클린 아키텍처
중첩 네비게이션 질문입니다.
안녕하세요. 강사님 Bottom tab 메뉴를 가지고 있는 중첩 네비게이션을 구현하고 있습니다. 각 탭 별로 네비게이션 관리를 하기 위해 탭 별 NavigatorState Key 를 저장하여 관리하고 static final GlobalKey<NavigatorState> navHome = GlobalKey(); static final GlobalKey<NavigatorState> navIntro = GlobalKey(); static final GlobalKey<NavigatorState> navPayment = GlobalKey(); 탭 내에서 push 를 하면 내비게이션 내부에서만 페이지가 활성화 되기에 화면 전체를 덮는 페이지들도 필요해 아래와 같이 선언하여 사용하여 탭을 감싸고 있는 상위 위젯을 열었습니다. static final GlobalKey<NavigatorState> navRoot = GlobalKey(); 홈 탭에서 로그인이 필요하여 해당 부분을 (홈 탭에서 호출 부분) final result = await Navigator.push(NavigatorKeys.navRoot.currentContext!, MaterialPageRoute( builder: () => const SignInScreen(), settings: RouteSettings(name: SignInScreen.routeName), ), ) 전체 화면으로 호출하였고, 완료후 리턴값이 필요하여 await 로 push 후 리턴 값을 기다렸다가 출력 하니 null 이 됩니다. 로그인 화면에서 pop 전에 리턴 값은 확인 하였고요 (로그인 에서 pop 부분 ) Navigator.pop(NavigatorKeys.navRoot.currentContext!, param);param 이 null 이 아닌데 왜 홈 탭에서는 null 이 들어 올까요? bottom tab 을 감싸고 있는 상위 Widget 에서 await 호출 후 리턴값을 받으려 해도 동일 합니다. 하지만 홈 탭에서 로그인 화면을 context 로 push 하고, pop 에서도 context 로 pop 하면 리턴값이 정상적으로 넘어옵니다. (홈 탭에서 호출 부분) final result = await Navigator.push( context, MaterialPageRoute( builder: () => const SignInScreen(), settings: RouteSettings(name: SignInScreen.routeName), ),) 제가 뭔가 잘 못 사용하고 있는거겠죠? Navigation 에 대한 이해를 잘못하고 있는 걸까요?
- 미해결Flutter 중급 1편 - 클린 아키텍처
상태관리되는 변수들의 위치에 대해
상태관리를 viewModel에서 거의 다 하시는 것 같은데 이번 강의에서는 screen 생성자로 Note를 넘겨주셨습니다.다른 방식으로, notes_screen(목록화면)에서 노트를 클릭했을 때 ui 이벤트를 발생하여 add_edit_note_view_model에 note를 전달하고 그 값(viewModel의 note)을 add_edit_note_screen으로 전달 해서 사용 하는 것은 어떤가요?생성자로 넘겨주는 것이 훨씬 편하긴 하나 screen에 변수를 선언 안해야 될 것 같은 생각이 들어서 고민에 빠집니다. 특정 screen으로 navaigator.push 될때마다 값이 특정 값으로 초기화를 해야되는 상황에서viewModel에 값을 두고 viewModel을 계속 재성성하는지(강의에서는 노트를 새로 만들 때 배경색을 초기화하는 방법으로 설명),혹은 viewModel을 하나만 생성하고 screen이 init 될때마다 viewModel의 특정 값을 초기화 해주는지(initState에서 이벤트 발생을 하여),혹은 add_edit_note_screen의 note 변수처럼 선언해서 값을 초기화 하는지(viewModel 사용 안하는 방식)강사님의 생각이 궁금합니다.(첫번째 방식이 가장 간단하긴 하나 계속 생성된다는 것이 마음에 걸려서 2,3번째 방식을 생각하게 됐습니다.) 답이 없다는 것은 알고 있지만 어떤 것이 더 좋은 선택이고 좋은 코드가 될 수 있는지 계속 생각하게 되다보니 모호한 질문들을 하게 됐습니다. 덕분에 생각을 많이 하게 되고 플러터의 매력에 빠졌습니다.감사합니다.
- 미해결Flutter 중급 1편 - 클린 아키텍처
맥북 sdk 문제
안녕하세요. 커맨드+ s를 누르고 에뮬레이터에 싱크로나이징하는 것이 안됩니다.항상 stop을 누르고 다시 플레이해야합니다. Performing hot reload...Syncing files to device sdk gphone64 arm64...에서 멈춰있어요. 어떻게 수정해야 해결될까요. .. 꼭 알려주시면 감사드리겠습니다. _______________________________________________환경변수 설정하려니 이렇게 뜹니다.Last login: Fri Nov 18 10:46:53 on ttys001(base) selena@selenaui-MacBookPro ~ % export PATH="$PATH: [PATH_OF_FLUTTER_GIT_DIRECTORY]/bin"(base) selena@selenaui-MacBookPro ~ % echo $PATH/opt/local/bin:/opt/local/sbin:/opt/homebrew/bin:/opt/homebrew/sbin:/Users/selena/opt/anaconda3/bin:/Users/selena/opt/anaconda3/condabin:/opt/homebrew/bin:/opt/homebrew/sbin:/usr/local/bin:/System/Cryptexes/App/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin:/opt/X11/bin:/Library/Apple/usr/bin:/bin:/Users/selena/Library/Android/sdk/platform-tools:/Users/selena/Documents/flutter/bin: [PATH_OF_FLUTTER_GIT_DIRECTORY]/bin(base) selena@selenaui-MacBookPro ~ % _________
- 미해결Flutter 중급 1편 - 클린 아키텍처
stream 데이터
안녕하세요.현재 앱을 만들고 있는데, 고민하고 있는게 해결이 안되어 질문드립니다. viewModel에 Stream 데이터를 넣고싶은데 어떻게 해야될까요?해당 데이터를 구독하여, view의 consumer 위젯에서 재빌드 되고싶습니다. 그래서, streamprovider를 MultiProvider에 선언하여 사용하면, viewmodel 밖으로 빠져나가는데, mvvm 패턴이 아닌거같고요... Streamprovider를 MultiProvider에서 생성하여, ProxyProvider로 viewmodel을 만들어야할까요??
- 미해결Flutter 중급 1편 - 클린 아키텍처
freezed dataclass 파일 어떻게 생성해요?
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 강사님이 설명을 안해주셨는데요, freezed를 설치했는데 강사님같이 dataclass를 입력하면 자동으로 뜨지 않아요. 어떻게 하신지 설명해주셔야 하는거 아닌가요
- 미해결Flutter 중급 1편 - 클린 아키텍처
강사님 안드로이드스튜디오에 master는 뭔가요?
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.터미널도 master이라고 나오던데 이건 따로 설치해야 하는건가요?
- 해결됨Flutter 중급 1편 - 클린 아키텍처
제가 이전 강의를 안들어서 그런데 Inherited widget 보충 설명좀 부탁드립니다.
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.안녕하세요. 이전 코스를 듣지 못하였습니다.현재 이 강의의 5강을 듣고 있습니다.photo_provider라는 이름으로 inherited widget을 만들어야 하는 이유는 무엇인가요? 그리고 photo_provider 코드 안에 old widget은 무엇인가요?
- 해결됨Flutter 중급 1편 - 클린 아키텍처
flutter doctor 실행시 Android toolchain 오류
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.[!] Android toolchain - develop for Android devices (Android SDK version 33.0.0) ✗ Android license status unknown. Run flutter doctor --android-licenses to accept the SDK licenses. See https://flutter.dev/docs/get-started/install/macos#android-setup for more details. flutter doctor --android-licensesERROR: JAVA_HOME is set to an invalid directory: /Library/Java/JavaVirtualMachines/1.8.0_202.jdk/Contents/HomeexportPlease set the JAVA_HOME variable in your environment to match thelocation of your Java installation.이것은 어떻게 해결해야 하나요?
- 미해결Flutter 중급 1편 - 클린 아키텍처
결국 테스트 할때는 더미데이터가 필요한건가요?
실제 백엔드와 소통시 백엔드가 좀 늦어진다던지 db에 가 데이터도 없어서 데이터를 전달 받을 수 없을때는 fakeJson 부분처럼 가 데이터가 있다고 생각하고 테스트를 진행해야 하는 게 맞나요? 저는 조금 의아한게 실제로 서버와의 소통시 저렇게 mock이라는 임의의 데이터와 임의의 통신코드를 받고 진행한걸 너무 믿게되어서 실제 데이터와 통신때 에러가 나더라도 ' 난 테스트 성공했다 내 문제는 아니다~' 라고 해버리는 개발자가 나오지 않을까... 질문은 1. 결국 가 데이터를 만들어 준뒤 그 데이터로 테스트를 하는건가요? 그럼 사실 테스트를 하는게 의미가 있나요? 가 데이터대로 데이터가 무조건 들어올껀데.. 저 가 데이터로 테스트한걸 토대로 '난 테스트 가 성공했다 내 문제는 아니다' 라고 할 수 있는걸까요? 테스트의 신뢰도가 있을까요?
- 미해결Flutter 중급 1편 - 클린 아키텍처
해당 코드로 학습한 내용들을 깃허브에 public repository에 공유해도 괜찮을까요/?
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 학습 내용을 깃허브에 등록하고 추후에 포트폴리오 형태로 아키텍쳐 패턴을 학습했다는 사유를 공개하고 싶습니다. 가능할까요?
- 미해결Flutter 중급 1편 - 클린 아키텍처
dotenv를 사용한 부분을 테스트하고 싶습니다.
dotenv를 사용한 부분은 테스트 시 못 읽어오나요?
- 미해결Flutter 중급 1편 - 클린 아키텍처
Flutter test 터미널 입력시
test 코드 작성 후 터미널에 flutter test 입력하고 실행하면 widget._test.dart 에서 실행할 수 ㅇ벗다고 뜨고그 파일을 삭제하면 main()을 못 찾아서 테스트를 실행을 못합니다 ㅠㅠ강의에서는 그냥 flutter test 만 입력해도 다 돌아가는데 왜 안될까요 ㅠㅠ
- 미해결Flutter 중급 1편 - 클린 아키텍처
기능과 UI를 분리하는 이유 중 의존성
fetch를 Widget 내부에서 실행할 경우 fetch가 동작하지 않을 때 Widget rendering이 안 될 수 있는 것을 의존적이다 라고 알고 있습니다.하지만 데이터가 없는 상황이 아니라면 의존적일 수 밖에 없는 것 아닌가요? 의존성을 가지지 않게 만들어야하는 이유를 모르겠습니다.
- 미해결Flutter 중급 1편 - 클린 아키텍처
페이지네이션 기능 추가에 관련하여 질문을 드립니다.
안녕하세요. 선생님의 강의에서 많은 것을 배울 수 있어서 너무나 좋은 시간이었습니다.강의를 한 번 듣고, 제 코드에 적용을 시키던 중 해결이 잘 되지 않는 부분에 대하여 궁금함이 생겨서 질문을 드립니다.초보라 질문이 깔끔하지 못한 점을 미리 양해를 부탁 드립니다. 제가 기존 프로젝트에서 참고하던 페이지네이션 기능은 다음과 같습니다.https://github.com/rutvik110/Flutter-Infinite-Pagination/blob/master/lib/src/pagination_notifier.dart : 강의에서의 viewModel 역할https://github.com/rutvik110/Flutter-Infinite-Pagination/blob/master/lib/src/pagination_state/pagination_state.dart : 강의에서의 state 역할 provider -> riverpod 으로 대체된 점, changeNotifier -> stateNotifier 로 대체된 점을 제외하면 기능적으로 유사해 보입니다. 강의를 수강한 후 제 코드를 리팩토링하면서 가장 난관에 부딪쳤던 부분은 다음과 같습니다. 1) 강의의 state는 dataclass로 작성되어 있다.state 파일이 모델의 List 정보를 담고 있습니다. .when 또는 .maybeWhen 분기를 사용할 수 없었습니다.isLoading 뿐만 아니라 페이지네이션의 loading, error 등 분기 처리할 상태 데이터가 점점 늘어남에 따라 복잡해져서photoState 안에 LoadingState 라는 sealed class를 생성하여 넣었습니다.changeNotifier가 리스트를 소유하는 것과, state가 리스트를 소유하는 것 중 어느 것이 바람직한지 제 코드를 보면서 의아해져서 질문을 드립니다. 2) 다른 screen을 작성할 때의 중복 코드 문제식물의 과, 속, 종에 따른 GridView를 작성하는 스크린에도, 위의 페이지네이션 기능이 필요합니다. 위의 페이지네이션 예제와 같이 제네릭을 이용해 타입을 전달하면 같은 코드를 중복하여 작성하지 않아도 될 것 같은데, 뷰 모델을 계속 고쳐가면서 방법을 찾아보고 있지만 마땅한 수가 떠오르지 않습니다. 선생님의 클린 아키텍처 강의의 예제는 디렉토리 구조가 직관적이고, 위 예제 코드는 그려야 할 페이지의 수와, 상황이 늘어남에도 분기 처리가 직관적이었습니다. 둘의 장점만을 모아서 코드를 작성하고 싶습니다만, 제 실력이 부족하여 코드 작성에 어려움이 있었습니다. 제 코드에서 필요 부분을 발췌한 리포지토리입니다.https://github.com/feud72/flutter-pagination-code-snippet/ 바쁘신 것을 알지만 답을 얻을 곳이 없어서 염치 불구하고 질문 글을 올립니다. 감사합니다!
- 미해결Flutter 중급 1편 - 클린 아키텍처
프레임워크에 독립적이다라는 것은?
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 안녕하세요강의 초반에 클린 아키텍처 구조를 사용하면 좋은 점으로프레임워크에 독립적이다 라고 말씀하셨는데프레임 워크에 독립적이라는 것이 무엇인지?왜 그것이 장점인지?가 궁금합니다 검색해봐도 잘 안나오더라구요
- 미해결Flutter 중급 1편 - 클린 아키텍처
기타 질문입니다.
혹시 유료라도 해서 코드 리뷰 받으실까요??
- 미해결Flutter 중급 1편 - 클린 아키텍처
listview 에서 모든 rows를 가져오는 것은, 개념상 맞지 않는건가요?
listview 에서 모든 rows를 가져오는 것은, 개념상 맞지 않아서 소용이 없는건가요?원격지에 있는 json data(예를들어 주문품목 같은)에 100개의 rows데이터를 listview 에 넣고이 100개의 rows가 모두 텍스트박스 하나씩 가지고 있을때 주문수량을 기입하고해당 데이터를 다시 원격지로 저장을 해야 하는데 100개의 텍스트박스의 데이터가 모두 변경 되었다면 리스트뷰가 모든 변경된 데이터를 모두 가지고 있나요?모바일에서는 기껏해야 20개 남짓 rows를 가지고 돌려 쓰는것으로 알고 있는데현재의 리스트뷰에 있는 모든 rows를 가져와 봐야 100개를 전부 return 해줄지 의문이 갑자기 드네요.위의 경우와 같을때 어떻게 저장을 하는게 좋을까요?
- 미해결Flutter 중급 1편 - 클린 아키텍처
usecase 질문 드립니다.
Usecase는 viewModel이 원하는대로 알맞게 사용할 수 있도록 데이터를 가공하거나 추가 작업을 하는 곳이라고 배웟는데요.같은 usecase가 여러개의 viewModel에서 사용되는것은 클린아키텍쳐상 전혀 문제 없을까요? 저는 없다고 생각하고 있긴 합니다. 위의 상황이 문제가 없다면 추가 질문입니다. A, B, C, D 의 useCase가 있고, E, F, G 라는 ViewModel 있습니다.E는 A,B // F는 A,C,D // G는 C useCase만을 필요로 하는 상황이면, di에서 각각의 useCase를 생성자로 넣어주면 될까요?
- 미해결Flutter 중급 1편 - 클린 아키텍처
fetch 이외에 메소드 에러처리
Future<Result?> update()업데이트를 한다고 가정했을 때,이렇게 Nullable한 Result를 반환하고,성공시에는 return null; 그리고 실패시에는 Result.error;를 반환하게 작성하였습니다. 혹시 이렇게 하는 것이 맞을까요? 아니면 좀 더 좋은 방법이 있을까요?
- 미해결Flutter 중급 1편 - 클린 아키텍처
sealed class 질문
freezed에서 sealed class 에 파라미터는 named 파라미터로 안될까요?? 문서를 봐도 잘 모르겠습니다 ㅠㅠ.