묻고 답해요
141만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결[코드팩토리] [중급] Flutter 진짜 실전! 상태관리, 캐시관리, Code Generation, GoRouter, 인증로직 등 중수가 되기 위한 필수 스킬들!
죄송합니다. 오늘 마지막 질문 입니다^^;(해결됨)
나름 열심히 따라 갔는데, 또 결제하기 버튼 누르면 결제를 실패했다는 스냅카드만 계속 뜹니다. 그래서 print(e) 를 해서 원인을 물어보니,type 'Null' is not a subtype of type 'String' in type cast라고 나오는데요, 제가 오류를 못찾는 걸수도 있겠지만, 여러 영상을 다시 뒤로 샅샅이 찾아가며 원인을 찾는데 못찾겠습니다..왜 다음 페이지로 넘어가지 않을까요? null값 때문이라면 어떻게 처리를 해야 할까요?// order_provider.dartimport '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, 인증로직 등 중수가 되기 위한 필수 스킬들!
질문이 있습니다 ㅠ(해결됨)
계속 이부분에서 오류가 나는데, 오류 설명이 이렇습니다.어떻게 해결해야 할까요..lib/common/provider/go_router.dart:15:24:Error: The argument type 'String? Function(GoRouterState)' can't be assigned to the parameter type 'FutureOr<String?> Function(BuildContext, GoRouterState)?'.- 'GoRouterState' is from 'package:go_router/src/state.dart' ('../../AppData/Local/Pub/Cache/hosted/pub.dev/go_router-12.0.1/lib/src/state.dart').- 'BuildContext' is from 'package:flutter/src/widgets/framework.dart' ('/C:/src/flutter/packages/flutter/lib/src/widgets/framework.dart').redirect: provider.redirectLogic,^Restarted application in 587ms. ------------------------------------------------------위부분의 문제를 redirectLogic을 타고들어가 기존 제너릭 앞에 buildContext context를 넣어주니 오류는 사라졌습니다. 그런데 앱실행 후에 또 다른 문제가 발생했습니다;화면은 계속 이 상태에 머물러 있고, 에러는 이렇게 뜹니다. 이건 어떻게 해야할까요ㅠㅠ[ERROR:flutter/runtime/dart_vm_initializer.cc(41)]Unhandled Exception: DioException [bad response]: The request returned an invalid status code of 401.E/flutter (13865): #0 DioMixin.fetch.<anonymous closure> (package:dio/src/dio_mixin.dart:507:7)E/flutter (13865): #1 _RootZone.runUnary (dart:async/zone.dart:1661:54)E/flutter (13865): #2 FutureListener.handleError (dart:async/futureimpl.dart:174:22)E/flutter (13865): #3 Future._propagateToListeners.handleError (dart:async/future_impl.dart:852:47)E/flutter (13865): #4 Future._propagateToListeners (dart:async/future_impl.dart:873:13)E/flutter (13865): #5 Future._completeError (dart:async/future_impl.dart:649:5)E/flutter (13865): #6 SyncCompleter.completeError (dart:async/future_impl.dart:60:12)E/flutter (13865): #7 Completer.completeError (dart:async/futureimpl.dart:26:5)E/flutter (13865): #8 Future.any.onError (dart:async/future.dart:620:45)E/flutter (13865): #9 _RootZone.runBinary (dart:async/zone.dart:1666:54)E/flutter (13865): #10 FutureListener.handleError (dart:async/futureimpl.dart:171:22)E/flutter (13865): #11 Future._propagateToListeners.handleError (dart:async/future_impl.dart:852:47)E/flutter (13865): #12 Future._propagateToListeners (dart:async/future_impl.dart:873:13)E/flutter (13865): #13 Future._completeError (dart:async/future_impl.dart:649:5)E/flutter (13865): #14 Future._asyncCompleteError.<anonymous closure> (dart:async/future_impl.dart:739:7)E/flutter (13865): #15 microtaskLoop (dart:async/schedulemicrotask.dart:40:21)E/flutter (13865): #16 startMicrotaskLoop (dart:async/schedulemicrotask.dart:49:5)일부 서치글을 통해 에뮬레이터 앱을 지우고 새로 여니 로그인화면으로 넘어갔습니다! 이 문제는 해결됐습니다~
-
미해결[코드팩토리] [중급] Flutter 진짜 실전! 상태관리, 캐시관리, Code Generation, GoRouter, 인증로직 등 중수가 되기 위한 필수 스킬들!
질문있습니다ㅠ
아래 화면을 구현했습니다. 그런데 재시작을 할 때마다, 아래와 같은 오류가 뜹니다. ======== Exception caught by widgets library =======================================================The following assertion was thrown while finalizing the widget tree:_PaginationListViewState<IModelWithId>.dispose failed to call super.dispose.dispose() implementations must always call their superclass dispose() method, to ensure that all the resources used by the widget are fully released.When the exception was thrown, this was the stack: #0 StatefulElement.unmount.<anonymous closure> (package:flutter/src/widgets/framework.dart:5513:7)#1 StatefulElement.unmount (package:flutter/src/widgets/framework.dart:5520:6)#2 ConsumerStatefulElement.unmount (package:flutter_riverpod/src/consumer.dart:578:11)#3 InactiveElements.unmount (package:flutter/src/widgets/framework.dart:1952:13)#4 InactiveElements.unmount.<anonymous closure> (package:flutter/src/widgets/framework.dart:1950:7)#5 ComponentElement.visitChildren (package:flutter/src/widgets/framework.dart:5349:14)#6 InactiveElements.unmount (package:flutter/src/widgets/framework.dart:1948:13)#7 InactiveElements.unmount.<anonymous closure> (package:flutter/src/widgets/framework.dart:1950:7)#8 ComponentElement.visitChildren (package:flutter/src/widgets/framework.dart:5349:14)#9 InactiveElements.unmount (package:flutter/src/widgets/framework.dart:1948:13)#10 InactiveElements.unmount.<anonymous closure> (package:flutter/src/widgets/framework.dart:1950:7)#11 SingleChildRenderObjectElement.visitChildren (package:flutter/src/widgets/framework.dart:6420:14)#12 InactiveElements.unmount (package:flutter/src/widgets/framework.dart:1948:13)#13 InactiveElements.unmount.<anonymous closure> (package:flutter/src/widgets/framework.dart:1950:7)#14 SingleChildRenderObjectElement.visitChildren (package:flutter/src/widgets/framework.dart:6420:14)#15 InactiveElements.unmount (package:flutter/src/widgets/framework.dart:1948:13)#16 InactiveElements.unmount.<anonymous closure> (package:flutter/src/widgets/framework.dart:1950:7)#17 ComponentElement.visitChildren (package:flutter/src/widgets/framework.dart:5349:14)#18 InactiveElements.unmount (package:flutter/src/widgets/framework.dart:1948:13)#19 InactiveElements.unmount.<anonymous closure> (package:flutter/src/widgets/framework.dart:1950:7)#20 ComponentElement.visitChildren (package:flutter/src/widgets/framework.dart:5349:14)#21 InactiveElements.unmount (package:flutter/src/widgets/framework.dart:1948:13)#22 InactiveElements.unmount.<anonymous closure> (package:flutter/src/widgets/framework.dart:1950:7)#23 ComponentElement.visitChildren (package:flutter/src/widgets/framework.dart:5349:14)#24 InactiveElements.unmount (package:flutter/src/widgets/framework.dart:1948:13)#25 InactiveElements.unmount.<anonymous closure> (package:flutter/src/widgets/framework.dart:1950:7)#26 ComponentElement.visitChildren (package:flutter/src/widgets/framework.dart:5349:14)#27 InactiveElements.unmount (package:flutter/src/widgets/framework.dart:1948:13)#28 InactiveElements.unmount.<anonymous closure> (package:flutter/src/widgets/framework.dart:1950:7)#29 ComponentElement.visitChildren (package:flutter/src/widgets/framework.dart:5349:14)#30 InactiveElements.unmount (package:flutter/src/widgets/framework.dart:1948:13)#31 ListIterable.forEach (dart:_internal/iterable.dart:39:13)#32 InactiveElements.unmountAll (package:flutter/src/widgets/framework.dart:1961:25)#33 BuildOwner.lockState (package:flutter/src/widgets/framework.dart:2639:15)#34 BuildOwner.finalizeTree (package:flutter/src/widgets/framework.dart:3049:7)#35 WidgetsBinding.drawFrame (package:flutter/src/widgets/binding.dart:919:19)#36 RendererBinding._handlePersistentFrameCallback (package:flutter/src/rendering/binding.dart:360:5)#37 SchedulerBinding._invokeFrameCallback (package:flutter/src/scheduler/binding.dart:1297:15)#38 SchedulerBinding.handleDrawFrame (package:flutter/src/scheduler/binding.dart:1227:9)#39 SchedulerBinding._handleDrawFrame (package:flutter/src/scheduler/binding.dart:1085:5)#40 _invoke (dart:ui/hooks.dart:170:13)#41 PlatformDispatcher._drawFrame (dart:ui/platform_dispatcher.dart:401:5)#42 _drawFrame (dart:ui/hooks.dart:140:31)
-
미해결[코드팩토리] [중급] Flutter 진짜 실전! 상태관리, 캐시관리, Code Generation, GoRouter, 인증로직 등 중수가 되기 위한 필수 스킬들!
Select 실습에서 질문이요!
Select 실습중에final state = ref.watch(selectProvider.select((value)=>value.isSpicy));해당 코드에서 질문이 있습니다!불필요한 빌드를 막기위해 특정 변수만 watch를 하면서 특정 부분만 랜더링을 다시 하는 부분으로 제가 이해를 했습니다.근데 저렇게 할 경우, 변수별로 저렇게 select를 하면 나중에는 코드가 엄청 길어질 수 있을것 같은데, 코드를 가독성 좋게 관리할 수 있는 방법이 혹시 있을까요??
-
미해결[코드팩토리] [중급] Flutter 진짜 실전! 상태관리, 캐시관리, Code Generation, GoRouter, 인증로직 등 중수가 되기 위한 필수 스킬들!
질문입니다.ㅠ
[ 질문1 ]7_query_parameter.dart 에서 ~of(context). 다음에 queryParameters가 자동으로 뜨지 않습니다. 6번의 pathPameters는 떠서 구현했는데, 이건 안뜨네요, 그래서 ~.uri.queryParameters로 하니까 떠서 일단 이걸로 선택해봤습니다. 그랬더니 화면이 조금 차이가 있었습니다.일단 코드입니다.import 'package:flutter/material.dart'; import 'package:go_router/go_router.dart'; import 'package:go_router_v7_actual/layout/default_layout.dart'; class QueryParameterScreen extends StatelessWidget { const QueryParameterScreen({super.key}); @override Widget build(BuildContext context) { return DefaultLayout( body: ListView( children: [ Text( 'Query Parameter : ${GoRouterState.of(context).uri.queryParameters}'), // /query_parameter?utm=google&source=123 // /query_parameter?name=codefactory&age=32 ElevatedButton( onPressed: () { context.push( Uri( path: '/query_param', queryParameters: { 'name': 'codefactory', 'age': '32', }, ).toString(), ); }, child: Text( 'Query Parameter', ), ), ], ), ); } }그리고 이건 화면인데요, title 뒤에 길게 이어진 text가 없습니다.그리고 버튼을 누를때마다 아래와 같은 페이지만 반복적으로 뜹니다.[ 질문2]go nest에서 네비게이션의 selectColor와 실제 선택이 일치하지 않습니다.ㅠㅠ 코드를 여러번 검토하며 뭐가 틀렸는지 수없이 봤는데, 못찾았습니다..
-
미해결[코드팩토리] [중급] Flutter 진짜 실전! 상태관리, 캐시관리, Code Generation, GoRouter, 인증로직 등 중수가 되기 위한 필수 스킬들!
섹션 15 - GoRouter적용하기 부분 질문
질문 1번id: state.pathParameter~만 나오고id: state.params~는 나오지않고 에러만 뜨네요 질문2번redirect: provider.redirectLogic(state) 이렇게만 나오고redirect: provider.redirectLogic 입력하면 에러가 나옵니다
-
미해결[코드팩토리] [중급] Flutter 진짜 실전! 상태관리, 캐시관리, Code Generation, GoRouter, 인증로직 등 중수가 되기 위한 필수 스킬들!
stata4가 build오류가 납니다.(수정됨)
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
-
해결됨[코드팩토리] [중급] Flutter 진짜 실전! 상태관리, 캐시관리, Code Generation, GoRouter, 인증로직 등 중수가 되기 위한 필수 스킬들!
notifier provider /state에 바로 추가하는 것과 add함수로 추가하는 것 차이
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, 인증로직 등 중수가 되기 위한 필수 스킬들!
redirect 조건설정 ?
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 진짜 실전! 상태관리, 캐시관리, Code Generation, GoRouter, 인증로직 등 중수가 되기 위한 필수 스킬들!
dio, retrofit, json_serializable의 관계
여러가지 패키지를 결합해서 사용하다보니 헷갈리는 과정이 있어서 질문드립니다. 제가 이해한 바로는 아래와 같은데 맞는지 확인부탁드립니다.. 패키지 정의: Dio는 Http통신을 간소화하며, 인터셉트를 통해 오류처리나 요청, 응답을 받을 때 무언가 작업을 할 수 있게 도와준다.Retrofit은 Dio를 통해 요청을 보내기 전 헤더 추가도 가능하고, GET method로 응답을 받은 후에 json_serializable을 활용해서 json데이터를 만들어둔 클래스에 매핑할 수 있도록 돕는다.패키지 활용:Retrofit으로 매핑가능하도록 RestaurantModel 클래스 등에 미리 factory생성자로 json_serializable .g.dart파일을 만들어둔 뒤 Dio로 서버응답을 받고 Retrofit을 통해 클래스로 매핑해서 메모리에 저장한다 까지가 지금까지 했던 과정인지요??
-
미해결[코드팩토리] [중급] Flutter 진짜 실전! 상태관리, 캐시관리, Code Generation, GoRouter, 인증로직 등 중수가 되기 위한 필수 스킬들!
Error (Xcode): Sandbox: rsync(13885) deny(1)
안녕하세요 아이폰 15 ios17 xcode15로 업그레이드 하고 나서부터 위와같은 오류로 빌드가 안되는데 혹시 이 이슈 알고 계실까요?
-
해결됨[코드팩토리] [중급] Flutter 진짜 실전! 상태관리, 캐시관리, Code Generation, GoRouter, 인증로직 등 중수가 되기 위한 필수 스킬들!
401 오류입니다.
현재 dio.dart의 onResponse 까지 작업을 했습니다. 그런데, I/flutter (11405): [REQ] [GET] http://10.0.2.2:3000/restaurant/5ac83bfb-f2b5-55f4-be3c-564be3f01a5bI/flutter (11405): [ERROR] [GET] http://10.0.2.2:3000/restaurant/5ac83bfb-f2b5-55f4-be3c-564be3f01a5b이렇게 뜨고 계속 401 에러가 납니다. 혹시나 로그인 문제인가 싶어 계속 postman에서 새로고침도 해봤는데 되지 않았습니다. (그러나 이미 해당 코드는 그럴 필요가 없는 단계) print되는 url을 주소창에 입력하니, 페이지가 나오지 않더라고요, 혹시 http://10.0.2.2:3000/ <-- 이 주소와 연관이 된 문제가 아닌가 싶은데, 어떻게 해결해야 할까요?
-
미해결[코드팩토리] [중급] Flutter 진짜 실전! 상태관리, 캐시관리, Code Generation, GoRouter, 인증로직 등 중수가 되기 위한 필수 스킬들!
jwt.io에서 토큰 확인 시
{ "refreshToken": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6InRlc3RAY29kZWZhY3RvcnkuYWkiLCJzdWIiOiJmNTViMzJkMi00ZDY4LTRjMWUtYTNjYS1kYTlkN2QwZDkyZTUiLCJ0eXBlIjoicmVmcmVzaCIsImlhdCI6MTY5Nzk3NDAzNSwiZXhwIjoxNjk4MDYwNDM1fQ.hQMG5C5jegj0zMHIyJBaLGoxIDeRLkw9CCkuTofG3QU", "accessToken": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6InRlc3RAY29kZWZhY3RvcnkuYWkiLCJzdWIiOiJmNTViMzJkMi00ZDY4LTRjMWUtYTNjYS1kYTlkN2QwZDkyZTUiLCJ0eXBlIjoiYWNjZXNzIiwiaWF0IjoxNjk3OTc0MDM1LCJleHAiOjE2OTc5NzQzMzV9.NuRi9YyLy0vwi4yy5pkC52-6tBq8ZnyzQwHKgkv2D6E" } jwt.io에 위 코드를 붙여넣기 하면 Invalid Signature 상태고,이때 Verify Signature에 codefactory를 입력해야 한다고 하였는데요.c만 입력해도 Signature Verified로 나오네요.심지어 아무 글자나 입력해도 그래요.왜 그런걸까요?제가 뭔가 잘못했을 것 같긴 한데요..
-
해결됨[코드팩토리] [중급] Flutter 진짜 실전! 상태관리, 캐시관리, Code Generation, GoRouter, 인증로직 등 중수가 되기 위한 필수 스킬들!
토큰이 탈취되는 시점은 언제인가요?
질문들 몇 가지 살펴보았는데 제가 이해한 바로는서버와 토큰으로 통신할 때 탈취가 진행되기 때문에 리프레쉬 토큰은 사용빈도가 적어 탈취위험이 적고 엑세스 토큰은 빈도수가 높아 탈취위험이 높기 때문에 유효기간을 짧게 한다인데여기서 궁금한 점은 토큰이 어느 시점에서 탈취되는지입니다.서버와 토큰으로 상호작용할 때 패킷을 빼와서 탈취하는 건가요?
-
미해결[코드팩토리] [중급] Flutter 진짜 실전! 상태관리, 캐시관리, Code Generation, GoRouter, 인증로직 등 중수가 되기 위한 필수 스킬들!
질문이 있습니다.
선생님의 flutter-lv2-server-main 파일은,만약 앱하나를 직접 만드는 개발자라면 이 파일도 직접 만들 줄 알아야 할까요?만든다면 어떻게 만들면 될까요?이것에 관한 수업은 없을까요?만약 이것에 관한 수업을 듣는다면, 어떤 영상을 찾아서 봐야할까요?직접 앱을 만들어서 공식 론칭을 하려고 할때, 이런 서버파일도 필요할텐데, 현재 이 수업에서는 그냥 선생님의 파일을 다운받아 스웨거 화면으로 넘어가고 있습니다. 이런 모든 과정에 대해 배우고 싶습니다.
-
미해결[코드팩토리] [중급] Flutter 진짜 실전! 상태관리, 캐시관리, Code Generation, GoRouter, 인증로직 등 중수가 되기 위한 필수 스킬들!
Dio onRequest Interceptor 작업하기 질문입니다
Dio onRequest Interceptor 작업하기에서다른 에러는 없는데디테일 화면이 안나오고 이런에러가 뜨네요.
-
미해결[코드팩토리] [중급] Flutter 진짜 실전! 상태관리, 캐시관리, Code Generation, GoRouter, 인증로직 등 중수가 되기 위한 필수 스킬들!
상위/하위 redirect 후 반응
안녕하세요 선생님.다름이 아니라 강의를 듣다가 강의 마지막쯤에GoRoute의 상위에서 redirect를 작성할 때와, routes안에 GoRoute(이하 하위)에서 redirect 할 때의 차이점을 설명해주셨는데요.그래도 눈으로 확인하고 싶어서 print()를 통해 디버깅하고자 아래와 같은 코드로 작성한 상태입니다.코드 -> 질문 순서로 하겠습니다.// 불필요한 코드는 임의로 삭제하겠습니다. import ... bool authState = false; final router = GoRouter( redirect: (context, state) { print(state.location); print('상위 redirect'); ... }, routes: [ ... GoRoute( path: 'login2', builder: (_, state) => LoginScreen(), routes: [ GoRoute( path: 'private', builder: (_, state) => PrivateScreen(), redirect: (context, state) { print(state.location); print('하위 redirect'); if(!authState) { return '/login2'; } return null; }, ), ], ) ], ), ], );작성한 코드는 이러합니다.상위에서 print문을 2번 사용해서 현재 위치와 상위redirect임을 밝힙니다.하위에서 마찬가지로 print문을 2번 사용해서 현재 위치와 하위redirect임을 밝힙니다. 여기서부터 궁금한게 여러가지 생겼습니다. login에 실패하여 /private으로 가지 못하는 상황입니다. 제가 생각했던 출력문은상위에서는I/flutter (20444): /login/private I/flutter (20444): 상위 redirect 이렇게 출력될 것이다 생각했는데 아래와 같이 나왔습니다.I/flutter (20444): /login/private I/flutter (20444): 상위 redirect I/flutter (20444): /login I/flutter (20444): 상위 redirectQ1. 이렇게 나오는 이유가 authState값을 모르는 채로 /private에 진입부터 했다가 (=출력문 1번), false값인걸 확인하고 /login으로 다시 돌아와서 출력문 3번이 나온것이 맞는지 궁금합니다.또한 하위 redirect에서 질문이 있습니다.먼저한 질문(Q1)이 맞다면 , 예상했던 출력값이 있습니다.예상출력값)I/flutter (20444): /login2/private I/flutter (20444): 하위 redirect I/flutter (20444): /login2 I/flutter (20444): 하위 redirect 그러나 실제로 출력결과는 아래와 같았습니다. I/flutter (20444): /login2/private I/flutter (20444): 상위 redirect I/flutter (20444): /login2/private I/flutter (20444): 하위 redirect I/flutter (20444): /login2 I/flutter (20444): 상위 redirect 상위는 /private에 갔다가 /login으로 돌아오는게 출력된 반면, 하위는 /private에 갔다가 돌아오는 출력문이 찍히지를 않았습니다. Q2. 그렇다면 왜 이렇게 출력되는지 플로우나 실행흐름 같은게 궁금합니다. 또한 상위와 하위 redirect가 무조건적으로 동시에 실행하게 된다면, 상위의 redirect는 하위의 redirect로 덮어쓰여져서 하위만을 실행하거나 하위 우선적인 로직이 수행하는지 궁금합니다. 감사합니다 X)
-
미해결[코드팩토리] [중급] Flutter 진짜 실전! 상태관리, 캐시관리, Code Generation, GoRouter, 인증로직 등 중수가 되기 위한 필수 스킬들!
로그인 시 resp 데이터 타입 에러 codec
디스코드 dm으로 프리미엄 채널 문의 드렸는데 초대가 안된것 같아서 여기에 질문드려요! 11:05 초 강의 처럼 resp.data하려고 하지만, 저는 에러 렌즈때문에 debugPrint로만 찍어야 run이 가능합니다. 그래서 코드는 아래 resp 함수를 다 지우고 debugPrint하면 토큰은 잘 나오지만, 아래처럼 하고 debugPrint(resp.data)를 하면 아래와 같은 에러가 발생합니다.저 코덱 뒤에가 다이내믹 타입이라는 그런거 때문이거 같습니다. 버전도 동일하게 일부러 맞춰봤는데도 그런거보면.. 이상하게 왜 강의에서는 에러가 안났을까요? 흠 ..
-
미해결[코드팩토리] [중급] Flutter 진짜 실전! 상태관리, 캐시관리, Code Generation, GoRouter, 인증로직 등 중수가 되기 위한 필수 스킬들!
세션2 Dio로 Auth API요청해보기 질문
세션2 Dio로 Auth API요청해보기 이전강의까지 실행후에,서버 작동하는거 다확인했습니다. 문제없었습니다. http://127.0.0.1:3000/api 도 잘들어가졌습니다서버 설정은 actual 플러터프로젝트 파일 말고,delivery_server라는 플러터프로젝트 파일을 만들어 작업했습니다. 본강의부분에서 플러터에 작업하려고 acual 프로젝트로 넘어갔고 강의부분 작업을 다한후에~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~print(resp.data); 로그인 버튼을 눌렀는데에러가 발생하지도 않는데refreshToken이 출력안되고화면에 아무것도 출력이 안되네요print(resp.data); 부분이 출력이 안되는거같습니다 다른프로젝트로 넘어가면서 서버가 종료된거같은데 어떻게 해결해야할까요?
-
미해결[코드팩토리] [중급] Flutter 진짜 실전! 상태관리, 캐시관리, Code Generation, GoRouter, 인증로직 등 중수가 되기 위한 필수 스킬들!
Riverpod CodeGeneration 깃허브 링크는 어디있나요?
안녕하세요.일반 riverpod는 찾았는데Code Generation기능이 추가된 깃허브는 어디있나요?