묻고 답해요
141만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결급하게 준비하는 모바일 앱 점검
Mac OS도 수강 및 실습이 가능한지요?
안녕하세요. 강사님저는 윈도우가 아닌 Mac m1으로 진행을 하려고 합니다.일단 막히는 부분이 없으면 답변을 주시기 전까지 계속 Mac OS로 하려고 하는데요.환경변수나 이후 실습 진행할때 윈도우와 다를거 같아서 질문드립니다.
-
해결됨[코드팩토리] [중급] Flutter 진짜 실전! 상태관리, 캐시관리, Code Generation, GoRouter, 인증로직 등 중수가 되기 위한 필수 스킬들!
StateNotifierProvider를 리버팟 제네레이터로 생성하기
class PaginationStateProvider<T extends IModelWithId, U extends IBasePaginationRepository<T>> extends StateNotifier<CursorPaginationBase> { final U repository; PaginationStateProvider({ required this.repository, }) : super(CursorPaginationLoading()) { paginate(); } Future<void> paginate() async { // 생략 } }위의 코드를 riverpod_generator 이용하는 코드로 바꾸고 싶은데 아무리 고민해봐도 모르겠습니다.@riverpod class PaginationState extends _$PaginationState { @override CursorPaginationBase build() { return CursorPaginationLoading(); } Future<void> paginate() async {} }이렇게 작성하면 로딩만 적용되니까 paginate()는 무시되고요... 샘플 코드를 알려 주실 수 있나요?
-
미해결[코드팩토리] [중급] Flutter 진짜 실전! 상태관리, 캐시관리, Code Generation, GoRouter, 인증로직 등 중수가 되기 위한 필수 스킬들!
JSON serialize 진행시 오류 문의드립니다.
안녕하세요.강의를 잘 듣고있습니다. "pub run build_runner build" 진행후에 다음과 같은 에러가 발생하여 json_annotaion의 버전을 4.8.1로 변경하였습니다. [INFO] Generating build script completed, took 260ms[INFO] Reading cached asset graph completed, took 171ms[INFO] Checking for updates since last build completed, took 584ms[WARNING] json_serializable on lib/restaurant/model/restaurant_mdoel.dart:The version constraint "^4.8.0" on json_annotation allows versions before 4.8.1 which is not allowed.[INFO] Running build completed, took 2.5s[INFO] Caching finalized dependency graph completed, took 94ms[INFO] Succeeded after 2.6s with 1 outputs (1 actions) json_annotation: ^4.8.1 dev_dependencies: flutter_test: sdk: flutter flutter_lints: ^2.0.0 build_runner: ^2.3.3 json_serializable: ^6.6.0이후 정상적으로 처리가 된것 처럼 결과가 나타났고, Built build_runner:build_runner.[INFO] Generating build script completed, took 258ms[INFO] Reading cached asset graph completed, took 174ms[INFO] Checking for updates since last build completed, took 581ms[INFO] Running build completed, took 2.5s[INFO] Caching finalized dependency graph completed, took 95ms[INFO] Succeeded after 2.6s with 1 outputs (1 actions) . lib 폴더를 reload 해도 restaurant_model.g.dart 파일이 만들어 지지않습니다.
-
미해결[코드팩토리] [중급] Flutter 진짜 실전! 상태관리, 캐시관리, Code Generation, GoRouter, 인증로직 등 중수가 되기 위한 필수 스킬들!
@Queries() 이노테이션
restaurant_repository.dart에서 사용되는 Future<CursorPagination<RestaurantModel>>paginate({ @Queries() PaginationParams? paginationParams=const PaginationParams(),}); @Queries() 이노테이션이 궁금합니다. 구글링해봐도 명확하게 나오지 않습니다.
-
미해결[코드팩토리] [중급] Flutter 진짜 실전! 상태관리, 캐시관리, Code Generation, GoRouter, 인증로직 등 중수가 되기 위한 필수 스킬들!
Restaurant Pagination - 3 문의사항
Restaurant Pagination - 3 챕터 중 궁금한 사항이 있어서 글을 남깁니다.RestaurantStateNotifier 클래스의 생성자에}) : super(CursorPaginationLoading()) { paginate();}라는 CursorPaginationLoading 상태를 넣었으며, restaurant_screen.dart에는 아래와 같은 로직이 들어있습니다.if (data is CursorPaginationLoading) { return Center( child: CircularProgressIndicator(), );}위 내용을 보았을때, 무한적으로 로딩이 걸려야 하는 것 아닌가요? 어떻게 약간의 로딩 후 정상적인 페이지를 나타내는지 이해가 잘 되지 않습니다..
-
미해결[코드팩토리] [중급] Flutter 진짜 실전! 상태관리, 캐시관리, Code Generation, GoRouter, 인증로직 등 중수가 되기 위한 필수 스킬들!
AuthRepository의 token() 메소드는 사용되는 곳이 없는것같은데 맞나요?
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.코드팩토리 디스코드https://bit.ly/3HzRzUMFlutter 강의를 구매하시면 코드팩토리 디스코드 서버 플러터 프리미엄 채널에 들어오실 수 있습니다! 디스코드 서버에 들어오시고 저에게 메세지로 강의를 구매하신 이메일을 보내주시면 프리미엄 채널에 등록해드려요! 프리미엄 채널에 들어오시면 모든 질의응답 최우선으로 답변해드립니다! 토큰을 재발급하는 로직은 dio interceptor 내부에서 일어나고있는것으로 이해했는데,그러면 AuthRepository에서 Future<TokenResponse> 타입을 반환하는 token()메소드는 왜 존재하고 어디에 사용되는 것인가요?
-
미해결[코드팩토리] [중급] Flutter 진짜 실전! 상태관리, 캐시관리, Code Generation, GoRouter, 인증로직 등 중수가 되기 위한 필수 스킬들!
go router redirect 동작 질문
안녕하세요 redirect 이용해서 구현하는 것에 질문이 있어요 예를 들면 1) 어떤 상세 페이지에서 컨텐츠 보고 있었음 2) 토큰만료 되서 로그인 페이지로 감 3) 재로그인하고 아까 상세 페이지로 복귀 또는 1) 로그아웃했음 (auth state 에 따라 redirect함)2) 뒤로 가기가 있는 로그인 페이지로 이동 3) 뒤로가기 하고 싶으나 (context.pop할 페이지가 없다고 나옴)이런 시나리오라 할 떄 go router 같은 경우 redirect 으로 로그인 페이지로 보내게 되면 context.pop할때 뒤로갈 페이지가 없다고 되는데 이런경우는 어떻게 다뤄야할까요? 당장 생각되는건 redirect 되는 페이지들이 context.go 처럼 작동되어서 context.push 같이 redirect 될 수 있도록 조절이 가능하면 좋을 것 같다는 생각이 드는데 방법이 있는지 궁금해요.만약에 위 해결 방법이 없다면 수동적으로라도 redirect 을 사용 안하고 auth state 별로 라우팅을 명시해주는게 나을까요..?아래는 구현한 코드 예제입니다 final goRouterProvider = Provider<GoRouter>((ref) { final authProvider = AuthNotifier(ref: ref); return GoRouter( navigatorKey: MyApp.navigatorKey, debugLogDiagnostics: false, initialLocation: RouterPathEnum.SPLASH.path, redirect: authProvider.redirectLogic, refreshListenable: authProvider, routes: [ ...RouterPathEnum.values .map( (value) => transitionRoute( path: value.path, routerEnum: value, duration: const Duration(milliseconds: 500), ), ) .toList(), ...goDynamicRouteList, /// -- Deep Link Page -- ], ); }); class AuthNotifier extends ChangeNotifier { final Ref ref; AuthNotifier({required this.ref}) { //LoginPlatformEnum 상태 listen -> 상태가 변경되면 notifyListeners() 호출 ref.listen<LoginPlatformEnum?>( authViewModelProvider, (previous, next) { if (previous != next) { notifyListeners(); } }, ); } String? redirectLogic(_, GoRouterState state) { final authState = ref.read(authViewModelProvider); /// 로그인 여부 final authenticated = authState; /// 로그인 하려는 경우 final authenticating = (state.matchedLocation == RouterPathEnum.LOGIN.path) || (state.matchedLocation == RouterPathEnum.SIGNUP.path) || (state.matchedLocation == RouterPathEnum.PASSWORD_RESET.path); final isSplash = (state.matchedLocation == RouterPathEnum.SPLASH.path); log('authenticated.value: $authenticated authenticating: $authenticating'); if (isSplash) return null; /** * authenticated - 로그인이 안된 경우 (LoginPlatformEnum.none) * 로그인을 시도하는 케이스 : 원하는 페이지로 이동 * 그 외 케이스 : 로그인 페이지 이동 */ if (authenticated == LoginPlatformEnum.NONE) { return authenticating ? null : RouterPathEnum.LOGIN.path; } /** * authenticated - 로그인 성공한 경우 * 로그인하려는 페이지 or splash -> total main 페이지로 이동 * 그 외 케이스 : 원하는 페이지로 이동 */ return (authenticating) ? RouterPathEnum.TOTAL_MAIN.path : null; } }
-
미해결[코드팩토리] [중급] Flutter 진짜 실전! 상태관리, 캐시관리, Code Generation, GoRouter, 인증로직 등 중수가 되기 위한 필수 스킬들!
401 에러(bad response)
안녕하세요. FutureBuilder로 레스토랑 데이터를 받는 과정에서 401 에러가 발생해서 질문드립니다.커뮤니티에서도 저와 비슷한 에러를 가진 분의 질문글을 봤었는데 해결된 답변이 없어서 올렸습니다.에러 내용입니다DIo interceptor 부분에서 문제일 것 같다는 답변을 주셨는데 어디를 손봐야할지 모르겠습니다 ㅠ...제 레포지토리 주소도 같이 올리겠습니다https://github.com/k2h2j3/flutter_study
-
해결됨[코드팩토리] [중급] Flutter 진짜 실전! 상태관리, 캐시관리, Code Generation, GoRouter, 인증로직 등 중수가 되기 위한 필수 스킬들!
factory를 Card에서 안 만들고 이런 방식은 어떤가요 ??
RestaurantCard에서 factory를 생성하지 않고 parse된 item을 RestaurantCard 타입으로 넣어주는건 안 좋은 방법일까요 ??
-
미해결[코드팩토리] [중급] Flutter 진짜 실전! 상태관리, 캐시관리, Code Generation, GoRouter, 인증로직 등 중수가 되기 위한 필수 스킬들!
ScrollController 동작이 안되서 질문드립니다.
"완성된 Pagination 로직 실행해보기" 강의에서 Scroll 위치를 찾기 위해서 반영한 ScrollController에서 Listener를 등록해도 스크롤 할때 동작을 하지 않아서 문의드립니다. - 리스너를 등록해도 스크롤 시 print('run') 이 동작을 안합니다..
-
미해결[코드팩토리] [중급] Flutter 진짜 실전! 상태관리, 캐시관리, Code Generation, GoRouter, 인증로직 등 중수가 되기 위한 필수 스킬들!
결제하기 버튼 누른후 주문탭 바로 갱신
안녕하세요. 정말 좋은강의 감사드립니다. 제가 지금 첫번째로 듣고있는중이라 정확히 모든걸 이해하면서 듣진 못하고있는데 장바구니에서 결제하기 눌러서 결제 완료하고 주문탭가면 방금 주문한 내역이 반영되지 않고 리프레쉬한번 해야 반영이 되는데 리프레쉬 안하고 바로 주문탭에 반영시키는 방법 생각해보다가 그냥basket_screen.dart에서 결제하기 버튼을 눌렀을때onPressed: () async {final resp = await ref.read(orderProvider.notifier).postOrder();if(resp){ await ref.read(orderProvider.notifier).paginate(forceRefetch:true);context.goNamed(OrderDoneScreen.routeName); }else{ScaffoldMessenget.of~~}}위와 같은식으로 그냥 버튼 누르고 바로 paginate(forceRefetch:true);을 통해 강제로 데이터 한번 갱신해버리는식으로 했는데 이렇게하면 안좋은게 있을까요..? 만약 안좋다면 어떤식으로 해야 주문탭에 바로 반영이 되게 할 수 있을까요 ㅜㅜ 주문탭에 옵티미스틱 리스폰스 코드를 어떻게 만들어서 어디에 적용시켜야할지 잘 모르겠습니다 ㅜㅜ
-
미해결[코드팩토리] [중급] Flutter 진짜 실전! 상태관리, 캐시관리, Code Generation, GoRouter, 인증로직 등 중수가 되기 위한 필수 스킬들!
Provider가 빠른 이유와 streambuilder
안녕하세요. futurebuilder대신 provider를 이용하는게 더 이득이라고 하셨는데 futurebuilder는 build가 될때마다 값을 가져오게 되는 것이고, provider는 build마다 값을 가져오지 않아도 되는 이유인가요??provider가 이렇게 이득이 생기는 이유는 flutter에서 provider는 항상 caching을 해두기 때문일까요?? 그리고 futurebuilder가 아닌 streambuilder도 provider와 비슷하게 값이 변경되면 실행되는 것으로 알고있는데 streambuilder를 대체할경우에도 이득이 있을까요? 감사합니다.
-
미해결[코드팩토리] [중급] Flutter 진짜 실전! 상태관리, 캐시관리, Code Generation, GoRouter, 인증로직 등 중수가 되기 위한 필수 스킬들!
redirectionLogic 에러관련 질문입니다
안녕하세요 코드팩토리님! 좋은 강의 잘 듣고 있습니다. 현재 115강까지 수강한 상태이고 go_router.dart 파일 안에 redirectionLogic부분에 에러가 발생하였습니다. 강사님과 달리 현재 go router 7 버전을 사용하고 있습니다. 버전 차이로 인해 추가로 수정해야하는 부분이 있거나 혹은 제가 실수한 부분이 있다면 알려주시면 감사하겠습니다 :) go_router.dartauth_provider.dartString? redirectLogic(GoRouterState state) { final UserModelBase? user = ref.read(userMeProvider); final logginIn = state.location == '/login'; if (user == null) { return logginIn ? null : '/login'; } // user is not null // UserModel // there is user information and // user is logging in or at the SplashScreen, // move on to home screen if (user is UserModel) { return logginIn || state.location == '/splash' ? '/' : null; } // UserModelError if (user is UserModelError) { return !logginIn ? '/login' : null; } return null; } 코드 실행 시 발생한 에러 메시지 입니다
-
미해결[코드팩토리] [중급] Flutter 진짜 실전! 상태관리, 캐시관리, Code Generation, GoRouter, 인증로직 등 중수가 되기 위한 필수 스킬들!
Cursor based pagination 내 신규 데이터 갱신 관련 문의
Cursor based pagination 사용 시 변경 데이터 (신규데이터 또는 삭제데이터) 는 패스하게 되는데, 변경데이터가 있는 경우에만 데이터를 갱신하는 refetch 로직은 어떤식으로 구성하면 될까요?
-
해결됨[입문] Qt QML과 C++로 시작하는 크로스플랫폼 앱 개발
onParentChanged -> onParentsignal 이유 문의
강의를 따라하면서 도중에 갑자기onParentChanged가 onParentSignal로 수정이 되었던데 onParentChanged는 언제 사용하는 걸까요?
-
미해결[코드팩토리] [중급] Flutter 진짜 실전! 상태관리, 캐시관리, Code Generation, GoRouter, 인증로직 등 중수가 되기 위한 필수 스킬들!
ios 이미지 전송 질문
Future<void> uploadFile() async { // file picker를 통해 파일 선택 final filePath = _image!.path; // 파일 경로를 통해 formData 생성 var dio = Dio(); var formData = FormData.fromMap({ 'file' : await MultipartFile.fromFile(filePath!) }); dio.options.contentType = 'multipart/form-data'; dio.options.maxRedirects.isFinite; final token = await ref.read(secureStorageProvider).read(key:ACCESS_TOKEN_KEY); dio.options.headers.addAll({ 'authorization': 'bearer $token', }); print("ok"); // 업로드 요청 final response = await dio.post("http://$ip/s3/upload", data: formData); _downloadUrl = response.data; print(response.statusCode.toString() + "hihi"); }이미지 업로드 코드로 위 코드를 사용하고있는데 안드로이드 애뮬레이터에서는 전송이 잘 되지만 ios에서 해당 코드를 실행하면[ERROR:flutter/runtime/dart_vm_initializer.cc(41)] Unhandled Exception: DioError [DioErrorType.response]: Http status error [401] 계속 위와 같은 에러가 뜹니다 구글에 검색해도 잘 안나와서 질문드립니다.
-
미해결[코드팩토리] [중급] Flutter 진짜 실전! 상태관리, 캐시관리, Code Generation, GoRouter, 인증로직 등 중수가 되기 위한 필수 스킬들!
riverpod 2 (async) notifier 사용?
https://riverpod.dev/ko/docs/migration/from_state_notifierriverpod 2 공식문서에 보면 Notifier/ AsyncNotifer 가 새롭게 도입되면서 StateNotifier는 더이상 사용되지 않는다고 나오는데 새로운 방식 강의 업데이트 안 해주시나요...?
-
해결됨[입문] Qt QML과 C++로 시작하는 크로스플랫폼 앱 개발
실행이 안되네요...
강의에서 알려주신 것처럼Visual studio 2019 community와 QT6를 설치했는데 아래 에러가 뜨면서 실행이 안되네요.. "ninja: build stopped: subcommand failed." 영상에서 알려준 설정을 모두 동일하게 적용했는데 왜 그럴까요..ㅜㅜ
-
미해결[코드팩토리] [중급] Flutter 진짜 실전! 상태관리, 캐시관리, Code Generation, GoRouter, 인증로직 등 중수가 되기 위한 필수 스킬들!
GoRouter 재빌드
리버팟 codegen을 쓰면서 강의를 듣다가 리버팟 codegen으로는 changeNotifier를 작성하지 못한다는 기사를 읽었습니다.다음 코드에서 막혔습니다.@riverpod GoRouter goRouter(GoRouterRef ref) { final provider = ref.read(authProvider.notifier); final user = ref.watch(userMeProvider); return GoRouter( routes: provider.routes, initialLocation: '/splash', // refreshListenable: ???, redirect: (_, state) { return provider.redirectLogic(state); }, ); }여기서 refreshListenable에 값을 넣어줘야 하는데 강의에서는 ChangeNotiferProvider로 했기 때문에 refreshListenable에 값을 넣어주는게 가능했는데 저는 codegen으로 하다보니 타입 에러가 뜨고 값을 넣어 줄 수가 없습니다.final user = ref.watch(userMeProvider);이 코드를 넣어서 user의 상태가 바뀌면 고라우터를 재빌드 시켜서 리다이렉트 함수를 다시 실행시키려고 했는데, user의 상태가 UserModelLoading에서 UserModel로 분명히 바뀜에도 불구하고 고라우터가 재빌드가 안됩니다. print() 넣어서 확인했습니다.그냥 리버팟 codegen 쓰지말고 v1처럼 하는게 나을까요? 아니면 refreshListenable에 넣어 줄 수 있는 다른 값이나 고라우터의 리다이렉트 함수를 또 실행시켜줄 장치가 있을까요?
-
미해결[코드팩토리] [중급] Flutter 진짜 실전! 상태관리, 캐시관리, Code Generation, GoRouter, 인증로직 등 중수가 되기 위한 필수 스킬들!
riverpod v2 관련 질문
안녕하세요저는 강의처럼 리버팟 v1이 아닌 어노테이션을 사용하는 v2버전으로 코딩을 하며 배우는 중입니다.그리고 강의처럼 클래스 안에 변수를 선언해서 생성자를 통해 레포지토리를 받는걸 하려고 합니다.@riverpod class UserMe extends _$UserMe { final UserMeRepository repo; UserMe({ required this.repo, }); @override UserModelBase? build() { return UserModelLoading(); } }이후 user_me_privder.g.dart를 보면 빨간줄이 보입니다.저 빨간줄에 커서 가져다 대면The argument type 'UserMe Function({required UserMeRepository repo})' can't be assigned to the parameter type 'UserMe Function()'. 요런 메세지가 뜹니다.해결방법이 있을까요?