강사님 안녕하세요 강사님 강의 덕분에 저 혼자서 페이지도 만들고 nginx 사용해서 서버까지 배포해보았습니다. 다름이 아니라 3일전 까지만 해도 느리긴 했지만 잘 되던 서버가 오늘 서버내의 기능을 사용할려고 하니 502 bad gateway를 내 뱉으면서 멈춰버립니다.(되다가 안되다가 반복함) 그래서 error 로그를 찾아보니 2023/11/01 00:20:22 [error] 10930#10930: *232 upstream prematurely closed connection while reading response header from upstream 라고 뜨네요 3일동안 해봤는데 헛발짓만 했네용.. gpt한테 물어봐도 메모리 리소스, 네트워크 문제 , 응답시간 문제 등 이라곤 하는데 메모리랑 네트워크에는 아무런 문제가 없는거 같습니다. 3일전까지만 해도 잘되던 서버가 안되니까 많이 답답하네요..
[코드팩토리] [중급] Flutter 진짜 실전! 상태관리, 캐시관리, Code Generation, GoRouter, 인증로직 등 중수가 되기 위한 필수 스킬들!
나름 열심히 따라 갔는데, 또 결제하기 버튼 누르면 결제를 실패했다는 스냅카드만 계속 뜹니다. 그래서 print(e) 를 해서 원인을 물어보니, type 'Null' is not a subtype of type 'String' in type cast 라고 나오는데요, 제가 오류를 못찾는 걸수도 있겠지만, 여러 영상을 다시 뒤로 샅샅이 찾아가며 원인을 찾는데 못찾겠습니다.. 왜 다음 페이지로 넘어가지 않을까요? null값 때문이라면 어떻게 처리를 해야 할까요? // order_provider.dart import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:level2/order/model/post_order_body.dart'; import 'package:level2/user/provider/basket_provider.dart'; import 'package:uuid/uuid.dart'; import '../model/order_model.dart'; import '../repository/order_repository.dart'; final orderProvider = StateNotifierProvider<OrderStateNotifier, List<OrderModel>>( (ref) { final repo = ref.watch(orderRepositoryProvider); return OrderStateNotifier( ref: ref, repository: repo, ); }, ); class OrderStateNotifier extends StateNotifier<List<OrderModel>> { final Ref ref; final OrderRepository repository; OrderStateNotifier({ required this.ref, required this.repository, }) : super([]); Future<bool> postOrder() async { try { final uuid = Uuid(); final id = uuid.v4(); final state = ref.read(basketProvider); final resp = await repository.postOrder( body: PostOrderBody( id: id, products: state .map( (e) => PostOrderBodyProduct( productId: e.product.id, count: e.count, ), ) .toList(), totalPrice: state.fold<int>( 0, (p, n) => p + (n.count * n.product.price), ), createdAt: DateTime.now().toString(), ), ); return true; } catch (e) { print(e); return false; } } } ------------------------------------------------------ 이것도 앱을 지웠다가 다시 까니까 갑자기 되네요; 반복될 가능성도 없진 않지만, 실제로 앱을 구현할 경우 이 문제가 계속 반복될 경우 그때마다 지웠다 다시 깔았다를 반복할 수 없을것 같은데.. 일단 이 문제는 이렇게 해결하고 넘어가기로 하겠습니다.^^;
[코드팩토리] [중급] Flutter 진짜 실전! 상태관리, 캐시관리, Code Generation, GoRouter, 인증로직 등 중수가 되기 위한 필수 스킬들!
Select 실습중에 final state = ref.watch(selectProvider.select((value)=>value.isSpicy)); 해당 코드에서 질문이 있습니다! 불필요한 빌드를 막기위해 특정 변수만 watch를 하면서 특정 부분만 랜더링을 다시 하는 부분으로 제가 이해를 했습니다. 근데 저렇게 할 경우, 변수별로 저렇게 select를 하면 나중에는 코드가 엄청 길어질 수 있을것 같은데, 코드를 가독성 좋게 관리할 수 있는 방법이 혹시 있을까요??
알려주신데로 코드 작성하면 어던 부분이 잘못되었는지 모르겠으나 정상 동작하지 않습니다. (입력 값 모두 입력 시 결과 화면으로 넘어가지 않음.) 인터넷 찾아보고 아래 처럽 바꾸니 정상 동작하는데, 어떤 것이 잘못된 것인지 알려주시면 감사하겠습니다. 동작 코드 if (_formKey.currentState!.validate()) { Navigator.push( context, MaterialPageRoute( builder: (context) => const ResultScreen( height: 175, weight: 1000, ), ), ); } 이상 코드(강의 내용 / 입력값중 빈곳이 있는 경우 결과 화면으로 이동) onPressed: () { if (_formKey.currentState?.validate() ?? false) { return; } Navigator.push( context, MaterialPageRoute( builder: (context) => const ResultScreen( height: 175, weight: 1000, ), ), ); }, 잘못된 곳 설명 부탁 드립니다.
[코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!
안녕하세요~! 클래스 생성 vs 함수 생성 관련해서 문의 드립니다. 이미 비슷한 질문에 대한 답변을 다 확인하였는데 여전히 궁금한점이 남아서요. 코드 정리를 할때 어떤때는 함수로 리턴해주고 어떤때는 클래스로 만들어서 build함수에서 리턴을 해주는걸로 알고 있습니다. 질문 1. 코드 정리를 할때 어떤건 함수로, 어떤건 클래스로, 이러한 판단은 상속하고 있는 parent를 모두 확인하고 매번 결정하시는건가요? 강의에서는 바로바로 결정을 하시고 진행하시는데 어떤 판단으로 하시는지 궁금합니다. 질문 2. AppBar의 경우 PreferredSizeWidget를 구현해야 해서 클래스로 만들수가 없는경우인것은 알겠습니다. 그렇다면 그 외에 구현해야할 부모 클래스가 없다면 모두 class로 만들면 될까요? 가령 Text는 StatelessWidget를 상속받고 있고 Expanded는 Flexible을 상속받고 있습니다.(결국 타고 올라가면 모두 Widget을 상속받고 있습니다). 이런경우 둘다 implement해줘야 할것은 없기에 클래스로 빼도 무관한 걸까요? 다른 분들도 비슷한 질문을 많이 하셨지만 확실히 어떤때는 클래스인지, 어떤때는 함수인지에 대한 부분이 많이 헷갈리고 있습니다. 도와주세요~!!
Webview 버전을 4.0 → 3.0.4로 바꾼 후에, 아래와 같은 오류가 발생하였습니다. 인터넷에 찾아봐도 내용이 안 나와서 문의드립니다. 어떻게 해결할 수 있을까요? 오류 문구 : lib/main.dart: Error: Error when reading '.dart_tool/flutter_build/dart_plugin_registrant.dart': 지정된 경로를 찾을 수 없습니다.
[코드팩토리] [중급] Flutter 진짜 실전! 상태관리, 캐시관리, Code Generation, GoRouter, 인증로직 등 중수가 되기 위한 필수 스킬들!
state1번부터 5번까지는 실행이 되는데, 4번만 입력하면 code_generation_provider.g.dart 파일에서 2개의 오류가 계속 발생합니다. 왜그런지 여러번 확인했는데, 코드상의 문제는 없는 것 같습니다. g.dart 파일은 수정이 안된다고 하셨는데, 어떻게 수정을 해야할까요?ㅠ // code_generation_provider.dart @riverpod int gStateMultiply( GStateMultiplyRef ref, { required int number1, required int number2, }) { return number1 * number2; } //code_generation_provider.g.dart
안녕하세요, 얼마 전까지 1~5회차 다 모여있는 노션링크가 있었던 것 같은데 찾을 수 없어서 질문 드립니다. 1. 노션 링크 다시 받을 수 있을까요? 2. 그리고 강의 수강 기한이 끝나면 노션도 닫히는지 궁금합니다! 강의 대시보드에 노션 평생 소장이라고 되어 있는데 노션 페이지 복제 기능 풀어주실 수 있나요..? 감사합니다.
[코드팩토리] [중급] Flutter 진짜 실전! 상태관리, 캐시관리, Code Generation, GoRouter, 인증로직 등 중수가 되기 위한 필수 스킬들!
onPressed: () { ref.read(shoppingListProvider.notifier).state += [ ShoppingItemModel( name: uuid.v1(), quantity: 5, hasBought: false, isSpicy: true) ]; }, 추가하는 것도 혼자 연습해보다가 의문이 생겼습니다. 위 코드에서는 watch해둔 것 때문에 build()가 바로바로 재실행되는 것 같은데 아래같이 List에 추가할 때처럼 add함수로 추가하면 build()가 되지 않고 HomeScreen으로 나갔다 들어와야만 적용이 되는 것을 볼 수 있었습니다. 똑같이 state에 model을 추가하는 것인데 무슨 차이가 있는 건가요? ref.read(shoppingListProvider.notifier).state.add( ShoppingItemModel( name: uuid.v1(), quantity: 5, hasBought: false, isSpicy: true) );
[코드팩토리] [중급] Flutter 진짜 실전! 상태관리, 캐시관리, Code Generation, GoRouter, 인증로직 등 중수가 되기 위한 필수 스킬들!
bool authState = false; final router = GoRouter( initialLocation: '/', errorBuilder: (context, state) { return ErrorScreen( error: state.error.toString(), ); }, redirect: (context, state) { print('MatchedLocation: ${state.matchedLocation}'); print('AuthState: $authState'); if (state.matchedLocation == '/login/private' && !authState) { return '/login'; } return null; }, 안녕하세요, 리다이렉트시 조건 설정로직이 이해가 잘 되지 않습니다. 초기 authState의 값은 'false'입니다. state.matchedLocation == '/login/private' && !authState 이부분에서 첫번째 조건은(state.matchedLocation == '/login/private') 'true', 두번째도 '!autoState'이므로 ' true'입니다. 그래서 모든 조건이 true가 되어서 로그인이 이루어져서 privateScreen으로 이동해야 될 것 같은데...잘 이해가 되지 않는 로직이라서 질문드립니다. 이렇게 쓰는게 좋을 것 같으나 .... if (state.matchedLocation == '/login/private' && !authState) { return '/login/private'; } return '/login'; } 라우터에서는 이렇게 써야 할 것 같은데요.... if (state.matchedLocation == '/login/private' && authState) { return '/login'; } return null; } 상기와 같이 쓰면 state.matchedLocation == '/login/private' && authState 은 당연한 참이기에 의미없는 조건문이 됩니다. 여하튼 잘 이해되지 않는 부분입니다.
[코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 코드팩토리 디스코드 https://bit.ly/3HzRzUM Flutter 강의를 구매하시면 코드팩토리 디스코드 서버 플러터 프리미엄 채널에 들어오실 수 있습니다! 디스코드 서버에 들어오시고 저에게 메세지로 강의를 구매하신 이메일을 보내주시면 프리미엄 채널에 등록해드려요! 프리미엄 채널에 들어오시면 모든 질의응답 최우선으로 답변해드립니다! 안녕하세요 현재 스타일링 마무리하기 << 여기 듣고 있습니다. 옆에 지역선택하기 누르면 안바뀐다고 나와있는데 그게 보니깐 제 코드에선 지역이 서울로 설정 돼있더라구요 그래서 어떤 지역을 넣든간에 서울로 고정돼있는 거 같은데 제가 실수로 빼먹었나해서 문의드렸습니다. 다른 지역 누르면 종류별 통계에 미세먼지가 양호가 아님에도 양호라고 뜨네요 앱바에 보이는 색과 아이콘은 서울 고정이고 지역이름은 바뀌는 것 같습니다. 다른 지역 누르면 종류별 통계에 미세먼지가 양호가 아님에도 양호라고 뜨네요
[코드팩토리] [중급] Flutter 진짜 실전! 상태관리, 캐시관리, Code Generation, GoRouter, 인증로직 등 중수가 되기 위한 필수 스킬들!
여러가지 패키지를 결합해서 사용하다보니 헷갈리는 과정이 있어서 질문드립니다. 제가 이해한 바로는 아래와 같은데 맞는지 확인부탁드립니다.. 패키지 정의: Dio는 Http통신을 간소화하며, 인터셉트를 통해 오류처리나 요청, 응답을 받을 때 무언가 작업을 할 수 있게 도와준다. Retrofit은 Dio를 통해 요청을 보내기 전 헤더 추가도 가능하고, GET method로 응답을 받은 후에 json_serializable을 활용해서 json데이터를 만들어둔 클래스에 매핑할 수 있도록 돕는다. 패키지 활용: Retrofit으로 매핑가능하도록 RestaurantModel 클래스 등에 미리 factory생성자로 json_serializable .g.dart파일을 만들어둔 뒤 Dio로 서버응답을 받고 Retrofit을 통해 클래스로 매핑해서 메모리에 저장한다 까지가 지금까지 했던 과정인지요??
디버그 콘솔 문구는 아래와 같습니다. E/flutter ( 8209): [ERROR:flutter/runtime/dart_vm_ initializer.cc (41)] Unhandled Exception: PlatformException(null-error, Host platform returned null value for non-null return value., null, null) 커뮤니티에 비슷한 오류 해결 방법 제시해주신거 보고 그것도 해봤는데 안되네요; 계속 여기 막혀있습니다ㅠ_ㅠ 아래 제가 설정한 부분 이미지 첨부합니다. 확인부탁드립니다.