묻고 답해요
131만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨[코드팩토리] [중급] Flutter 진짜 실전! 상태관리, 캐시관리, Code Generation, GoRouter, 인증로직 등 중수가 되기 위한 필수 스킬들!
UserMeProvider 회원가입
안녕하세요 강사님 또 저입니다ㅠㅠ 중급강의의 로그인과 인증로직을 조금씩 변형해 현재 진행중인 프로젝트에 적용하려하는데 회원가입 POST가 필요한데 이를 예를들면 강의기준으로 UserMeStateNotifier내부에 Future<UserModelBase> login가 있듯이, Future<UserModel> postUser(UserModel userModel)로 Provider파트에 선언하고 @POST() Future<UserModel> postUser(@Body() UserModel user); 이런형태로 한 UserModel내에 선언해도될지 감이 안잡혀서 여쭤봅니다.이런부분에서 막힌거보니 아직 완전 이해를 못한거같습니다ㅠㅠ
-
미해결입문강의 타입스크립트부터 ionic6 (앵귤러 기반)
VirtualScroll 이 버전 업데이트 되면서 많이 바뀐거 같아요..
virtualScroll 강의 듣는 중에 에러가 계속 나서 찾아보니 버전 업데이트 되면서 아예 바뀌었더라고요.. 괜찮으시다면 이런 내용은 업데이트가 안될까요..?Docs 보면서 혼자 해보고는 있는데 어렵습니다..
-
해결됨[코드팩토리] [중급] Flutter 진짜 실전! 상태관리, 캐시관리, Code Generation, GoRouter, 인증로직 등 중수가 되기 위한 필수 스킬들!
115강 5분 10초, model의 타입을 ProductModel로 지정했을 때 발생하는 타입 및 null 에러가 있습니다
class ProductPage extends StatelessWidget { const ProductPage({super.key}); @override Widget build(BuildContext context) { return PaginationListView<ProductModel>( provider: productProvider, itemBuilder: <ProductModel>(_, index, ProductModel model) => GestureDetector( onTap: () => context.goNamed( RestaurantDetailPage.routeName, pathParameters: { 'rid': model.restaurant.id, }, ), child: ProductCard.fromProductModel( model: model, ), ), ); } }여기서 이상한 에러가 뜹니다. 먼저 'rid': model.restaurant.id 이 부분에서는 아래와 같은 에러가 뜹니다.The property 'restaurant' can't be unconditionally accessed because the receiver can be 'null'.Try making the access conditional (using '?.') or adding a null check to the target ('!').dartunchecked_use_of_nullable_value 그리고 두 번째로, ProductCard.fromProductModel(model: model)에서는 이런 에러가 뜹니다.The argument type 'ProductModel' can't be assigned to the parameter type 'ProductModel'.dartargument_type_not_assignable 두 에러 모두 이해되지 않습니다. ProductModel 타입을 ProductModel 타입으로 Assign할 수 없다니요? 같은 타입인데 이런 에러가 뜹니다. 또한 첫 번째 에러의 경우에도, 분명히 nullable 타입이 존재하지 않는데 nullable 체크를 하라고 하고 있습니다. 당황스럽습니다. 한편, 강의는 이런 식으로 되어 있습니다.itemBuilder: <ProductModel>(_, index, model)즉 model의 타입을 따로 지정해주지 않았습니다. 이렇게 했을경우 model의 타입은 dynamic이 되며, 자동 완성 기능은 수행할 수 없지만, 결론적으로 잘 작동은 합니다. 그런데 왜 저런 이상한 에러가 발생하는 지 모르겠습니다. 여기 이와 관련된 코드를 덧붙입니다. 그러나 대부분 강의와 동일합니다.@JsonSerializable() class ProductModel implements IModelWithId { @override final String id; /// 상품 이름 final String name; /// 상품 상세 정보 final String detail; /// 상품 이미지 URL @JsonKey(fromJson: DataUtils.pathToUrl) final String imgUrl; /// 상품 가격 final int price; /// 레스토랑 정보 final RestaurantModel restaurant; ProductModel({ required this.id, required this.name, required this.detail, required this.imgUrl, required this.price, required this.restaurant, }); factory ProductModel.fromJson(Map<String, dynamic> json) => _$ProductModelFromJson(json); }typedef PaginationWidgetBuilder<T extends IModelWithId> = Widget Function( BuildContext context, int index, T model, );문제가 발생하고 있는 스크린샷:
-
미해결[코드팩토리] [중급] Flutter 진짜 실전! 상태관리, 캐시관리, Code Generation, GoRouter, 인증로직 등 중수가 되기 위한 필수 스킬들!
보안 및 content type 질문
Token 발급 과정에서 username:password 값을 base64 로 인코딩 후 authorization 헤더에 Basic $token 형태로 전송하는 것이 정석이라고 말씀해주셨습니다.질문1.Basic $token 형태는 인증정보가 그대로 base64 형태로 인코딩해줍니다. 그러면 누군가가 이 패킷을 까보기만 하면 데이터를 알 수 있는 것이 아닌가요..? 이 부분이 이해가 잘 안되네요. 설명부탁드립니다..질문2.추가로 챗gpt 에게 질문했을 때, 로그인할 때 content type 을 application/x-www-form-urlencoded 형태로 보내라고 하는데, 대부분은 json 형태로 전송하더라구요.. 설명부탁드립니다...
-
미해결[코드팩토리] [중급] Flutter 진짜 실전! 상태관리, 캐시관리, Code Generation, GoRouter, 인증로직 등 중수가 되기 위한 필수 스킬들!
안녕하세요. 강사님 듣다가 헷갈리는 부분이 있습니다.
ref.watch를 작성하게 되면 ref 값이 변하게 되면 빌드를 다시하는거고ref.listen은 값이 변할때 빌드는 다시하지 않지만 값의 상태를 확인하고 이벤트를 실행해주는 것으로 이해해도 될까요?
-
해결됨[코드팩토리] [중급] Flutter 진짜 실전! 상태관리, 캐시관리, Code Generation, GoRouter, 인증로직 등 중수가 되기 위한 필수 스킬들!
riverpod 2.0 Notifer 관련하여 질문드립니다
riverpod 2.0에서는 StateNotifier대신 Notifier이나 AsyncNotifier를 사용하라고 되어있던데그러면 현재 강의에서 StateNotifer를 Notifier로 바꿀려고하니 의존성주입을 할때,StateNotifierProvider에서 생성자로 ref.watch로 authRepository,userMeRepository,storage를 넣어주는데궁금한것이 1.이를 Notifier에서는 어떻게 넣어주는게 가장 좋은 선택인가요??(생성시에 ref.watch로 한번만 만들기 vs 필요한곳마다 ref.watch사용하기 )초기 생성할때 UserModelLoading()을 한뒤에 state업데이트를 getMe함수에서 하는데 이를 try-finally로 하는것이 맞는 방법인가요?late final AuthRepository, late final UserMeRepository, ... 과 같이 final을 붙일시에 다시 build되는 상황이 생기던데 에러가 뜨던데 final을 안해도 괜찮은건가요?아래는 저가 바꿔본 코드입니다.final userMeProvider = StateNotifierProvider<UserMeStateNotifier,UserModelBase?>((ref) { final authRepository = ref.watch(authRepositoryProvider); final userMeRepository = ref.watch(userMeRepositoryProvider); final storage = ref.watch(secureStorageProvider); return UserMeStateNotifier( authRepository: authRepository, repository: userMeRepository, storage: storage, ); }); class UserMeStateNotifier extends StateNotifier<UserModelBase?> { final AuthRepository authRepository; final UserMeRepository repository; final FlutterSecureStorage storage; UserMeStateNotifier({ required this.authRepository, required this.repository, required this.storage, }) : super(UserModelLoading()) { //내 정보 가져오기기 getMe(); } Future<void> getMe() async { final refreshToken = await storage.read(key: REFRESH_TOKEN_KEY); final accessToken = await storage.read(key: ACCESS_TOKEN_KEY); if (refreshToken == null || accessToken == null) { state = null; return; } final resp = await repository.getMe(); state = resp; } /* *login, logout생략 */ } final userMeProvider = NotifierProvider<UserMeNotifier,UserModelBase?>(UserMeNotifier.new); class UserMeNotifier extends Notifier<UserModelBase?>{ late AuthRepository authRepository; late UserMeRepository repository; late FlutterSecureStorage storage; @override UserModelBase? build() { try{ authRepository = ref.watch(authRepositoryProvider); repository = ref.watch(userMeRepositoryProvider); storage = ref.watch(secureStorageProvider); return UserModelLoading(); }finally{ getMe(); } } Future<void> getMe() async { final refreshToken = await storage.read(key: REFRESH_TOKEN_KEY); final accessToken = await storage.read(key: ACCESS_TOKEN_KEY); if (refreshToken == null || accessToken == null) { state = null; return; } final resp = await repository.getMe(); state = resp; } }
-
미해결[코드팩토리] [중급] Flutter 진짜 실전! 상태관리, 캐시관리, Code Generation, GoRouter, 인증로직 등 중수가 되기 위한 필수 스킬들!
NoSuchMethodError 해결요청
강의 3번째 보면서 진행중인데 에러 해결이 안되서 문의올립니다.강의는 섹션 5-5 레스토랑 상세요청 구현하기 입니다.The relevant error-causing widget was:FutureBuilder<Map<String, dynamic>> FutureBuilder:file:///D:/flutter_project/baemin/lib/restaurant/view/restaurant_detail_screen.dart:39:1639번 라인은 아래 그림보시면 되겠습니다. - 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.코드팩토리 디스코드https://bit.ly/3HzRzUMFlutter 강의를 구매하시면 코드팩토리 디스코드 서버 플러터 프리미엄 채널에 들어오실 수 있습니다! 디스코드 서버에 들어오시고 저에게 메세지로 강의를 구매하신 이메일을 보내주시면 프리미엄 채널에 등록해드려요! 프리미엄 채널에 들어오시면 모든 질의응답 최우선으로 답변해드립니다!
-
미해결[코드팩토리] [중급] Flutter 진짜 실전! 상태관리, 캐시관리, Code Generation, GoRouter, 인증로직 등 중수가 되기 위한 필수 스킬들!
DioError 코드 사용 문제
선생님 제 Dio버전이 달라서 그런건지 플러터 문제인지 } on DioError catch (e) {코드에서 DioError를 사용할 수 없다는 메세지가 뜹니다.// 'DioError' is deprecated and shouldn't be used. Use DioException instead. This will be removed in 6.0.0.Try replacing the use of the deprecated member with the replacement.라는 메세지가 뜨며 DioException을 사용하라는 것 같은데강의버전과 동일한 dio버전으로 내린뒤에 펍겟해도 똑같이DioError와 DioErrorType에 선이 그어져있어 // ignore : deprecated_member_use } on DioError catch (e) {위의 주석코드를 입력하게 되면 DioError 코드 에러가 사라집니다. 이렇게 사용해도 상관이 없는지DioException을 사용해야 하는지 궁금합니다.
-
미해결[코드팩토리] [중급] Flutter 진짜 실전! 상태관리, 캐시관리, Code Generation, GoRouter, 인증로직 등 중수가 되기 위한 필수 스킬들!
GoRouter PushAndRemoveUntil 관련
안녕하세요,프로젝트에서 GoRouter를 사용해서 페이지들을 구현하고 있는데요,GoRouter에서는 Navigator.PushAndRemoveUntil에 해당하는 함수가 없을까요?없다면 비슷하게 구현할 수 있는 방법이 있을까요?감사합니다.
-
해결됨[코드팩토리] [중급] Flutter 진짜 실전! 상태관리, 캐시관리, Code Generation, GoRouter, 인증로직 등 중수가 되기 위한 필수 스킬들!
안녕하세요 선생님! 중급강의 적용에 있어 질문드립니다!
안녕하세요!! 코드팩토리님 초급, 중급 강의를 완강한후 인터뷰 매칭 서비스 앱을 개발해보고자하는 학생입니다. 다름이아니라, 앱 설계를 하다 보니 하나의 인터뷰에 인터뷰의뢰 테이블, 인터뷰의뢰채널테이블,인터뷰참여테이블 등 이들간의 관계를 표현하고 각 인터뷰 건에 대한 pagination 적용도 해야하는데, 이 각각의 테이블을 중급강의에서 배운 것들을 model, repository,provider,view 폴더로 나누어 그대로 적용해보고자 하는데 이렇게 하는게 맞을지 갈피가 안잡혀서 질문남기겠습니다. 제가 아직 프로그래밍 경험이 부족해서ㅠㅠ 질문이 다소 추상적으로 느껴졌다면 죄송합니다.
-
미해결[코드팩토리] [중급] Flutter 진짜 실전! 상태관리, 캐시관리, Code Generation, GoRouter, 인증로직 등 중수가 되기 위한 필수 스킬들!
AppBar 질문
아래 스크린샷처럼 appbar 중앙 정렬이 안되는데몇번을 돌려봐도 강사님과 같은 코드입니다.어떤 옵션이 추가 되어야 할까요?? - 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.코드팩토리 디스코드https://bit.ly/3HzRzUMFlutter 강의를 구매하시면 코드팩토리 디스코드 서버 플러터 프리미엄 채널에 들어오실 수 있습니다! 디스코드 서버에 들어오시고 저에게 메세지로 강의를 구매하신 이메일을 보내주시면 프리미엄 채널에 등록해드려요! 프리미엄 채널에 들어오시면 모든 질의응답 최우선으로 답변해드립니다!
-
미해결[코드팩토리] [중급] Flutter 진짜 실전! 상태관리, 캐시관리, Code Generation, GoRouter, 인증로직 등 중수가 되기 위한 필수 스킬들!
이미지가 에뮬레이터에서 보이지 않는 문제
에뮬레이터에서 이미지를 불러오려고 하면 Unable to load asset이 뜨면서 보이지 않습니다!web으로는 'images/logo.png' 경로로 주면 뜨는데 에뮬레이터는 둘 다 안됩니다. pubspec.yaml 파일에이렇게 넣어주었습니다.폴더는 이렇게 설정했습니다!
-
미해결[코드팩토리] [중급] Flutter 진짜 실전! 상태관리, 캐시관리, Code Generation, GoRouter, 인증로직 등 중수가 되기 위한 필수 스킬들!
안녕하세요 선생님
앱을 시작할 때, splash 스크린을 보여주고, 유저의 정보에 따라 redirect하려합니다. 그런 기대로 지금 현재 코드를 짰는데, 기대한것과 달리 splash 스크린이 아예 띄워지지 않고 곧바로 redirect 됩니다. 혹시 제가 원했던 것처럼 splash 스크린을 단 1초간이라도 보여준 다음 유저 정보에 따라 redirect 하는 방법이나 현재문제의 원인을 알 수 있을까요? 참고로 go router의 버전은 v8입니다.
-
해결됨[코드팩토리] [중급] Flutter 진짜 실전! 상태관리, 캐시관리, Code Generation, GoRouter, 인증로직 등 중수가 되기 위한 필수 스킬들!
안녕하세요 선생님 또 저입니다
GoRouter 의 redirect 에 provider.redirectLogic 을 넣어주셨는데, 이렇게 설정하면 GoRouter 의 routes 안에서 이동이 일어날때마다 redirectLogic 이 실행되도록 구현하신게 맞나요? 제가 제대로 이해한게 맞는지 확인하고싶어서 글 남깁니다
-
미해결[코드팩토리] [중급] Flutter 진짜 실전! 상태관리, 캐시관리, Code Generation, GoRouter, 인증로직 등 중수가 되기 위한 필수 스킬들!
안녕하세요 선생님 GoRouter 10 버전을 사용해보고 있는데요
기존에 4, 7 버전에서는 GoRouterState 에 location 속성이 있는데 10 버전에는 없더라구요.Uri 타입의 uri 가 새로 생겼던데location 대신 matchedLocation 을 사용해서 auth_provider.dart 를 만들어도 될까요?
-
미해결[코드팩토리] [중급] Flutter 진짜 실전! 상태관리, 캐시관리, Code Generation, GoRouter, 인증로직 등 중수가 되기 위한 필수 스킬들!
자동완성
너무 기초적인 질문이라 죄송합니다.강의 초반부에 StatelessWidget을 만드시는데 단축키를 사용하시는지 갑지가 몇글자 안치셨는데 비어있는 코드가 쭉 생기던데요.단축키인가요....???- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.코드팩토리 디스코드https://bit.ly/3HzRzUMFlutter 강의를 구매하시면 코드팩토리 디스코드 서버 플러터 프리미엄 채널에 들어오실 수 있습니다! 디스코드 서버에 들어오시고 저에게 메세지로 강의를 구매하신 이메일을 보내주시면 프리미엄 채널에 등록해드려요! 프리미엄 채널에 들어오시면 모든 질의응답 최우선으로 답변해드립니다!
-
해결됨[코드팩토리] [중급] Flutter 진짜 실전! 상태관리, 캐시관리, Code Generation, GoRouter, 인증로직 등 중수가 되기 위한 필수 스킬들!
provider의 state 초기 생성 시기
riverpod을 사용하는 provider의 경우 초기 state를 (ref) => initialState 형식으로 지정해주도록 되어있습니다. 그런데 궁금한 것이 해당 초기 상태 값이 생성되는 시기가 어떤 view에서 처음으로 watch를 하는 때인 것인지 아니면 app이 처음 build되는 시기인지 궁금합니다. 즉, watch를 하지 않고 read를 통해 state를 변경하는 경우 이미 초기 state가 생성되어있는 상태인 것인지 궁금합니다.
-
해결됨[코드팩토리] [중급] Flutter 진짜 실전! 상태관리, 캐시관리, Code Generation, GoRouter, 인증로직 등 중수가 되기 위한 필수 스킬들!
안녕하세요 선생님 질문이 있습니다
user/repository/auth_repository.dart위 파일을 작업할때는 retrofit 을 사용하지 않는 이유가 따로 있으신건가요?
-
미해결[코드팩토리] [중급] Flutter 진짜 실전! 상태관리, 캐시관리, Code Generation, GoRouter, 인증로직 등 중수가 되기 위한 필수 스킬들!
iOS 실제 기기 Login 테스트 에러
안녕하세요.ip를 확인하고 android와 iOS 기기를 통해 테스트 중 에러가 발생했습니다.android 기기에선 문제 없이 동작하는데 iOS 기기에선 SocketException: Connection failed (OS Error: No route to host, errno = 65), address = 192.168.0.122, port = 3000 메시지와 함께 에러가 발생합니다.퍼미션이 잘못된 것인지 이유를 모르겠어서 질문드립니다!
-
미해결[코드팩토리] [중급] Flutter 진짜 실전! 상태관리, 캐시관리, Code Generation, GoRouter, 인증로직 등 중수가 되기 위한 필수 스킬들!
안녕하세요 강사님
안녕하세요 강사님 플러터 상태관리 관련해서 검색을 해보니까 최근에는 Provider + Bloc 상태관리를 가장 많이 선호한다고 들었는데 혹시 추후에 Bloc 부분을 강의에 추가하실 예정이 있으신지 여쭈어보고 싶습니다.