묻고 답해요
160만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결[코드팩토리] [중급] Flutter 진짜 실전! 상태관리, 캐시관리, Code Generation, GoRouter, 인증로직 등 중수가 되기 위한 필수 스킬들!
토큰 체크 MaterialPageRoute String
void checkToken() async { final refreshToken = await storage.read(key: REFRESH_TOKEN_KEY); final accessToken = await storage.read(key: ACCESS_TOKEN_KEY); if (refreshToken == null || accessToken == null) { Navigator.of(context).pushNamedAndRemoveUntil( MaterialPageRoute( builder: (_) => LoginScreen() ), (route)=> false, ); }else{ Navigator.of(context).pushNamedAndRemoveUntil( MaterialPageRoute( builder: (_) => RootTab() ), (route)=> false, ); } }강의와 동일하게 작성한 해당 코드에서 아래와 같은 오류가 생성됩니다.MaterialPageRoute<dynamic>' can't be assigned to the parameter type 'String'.
-
미해결[코드팩토리] [중급] Flutter 진짜 실전! 상태관리, 캐시관리, Code Generation, GoRouter, 인증로직 등 중수가 되기 위한 필수 스킬들!
data 변수명에 대해
안녕하세요.flutter 중급 강의를 들으면서 궁금한 점이 생겨서 질문 드립니다.지금까지 수많은 변수명들을 작성해 왔는데요.그중에서 data라는 변수명들이이 클래스마다 여러곳에 배치되어 있는 느낌을 받았습니다. 그래서 헷갈려하지 않기 위해 앞의 약자를 덧붙여 자신만의 변수명을 만들어 왔습니다. ex) final List<T> data; --> final List<T> cpData;하지만 [pagination params추가하기] 강의를 듣는 도중에 테스트를 해보니E/flutter (21276): [ERROR:flutter/runtime/dart_vm_initializer.cc(41)] Unhandled Exception: type 'Null' is not a subtype of type 'List<dynamic>' in type cast오류가 발생하였고 혹시 몰라서 data를 원래대로 되돌리고 실행해 보았는데 정상적으로 작동하였습니다.변수명을 바꿀뿐이였는데 타입을 NULL로 인식하는 이유가 궁금합니다.(콘솔창에 flutter pub run build_runner watch 실행중이였습니다.)
-
미해결[코드팩토리] [중급] Flutter 진짜 실전! 상태관리, 캐시관리, Code Generation, GoRouter, 인증로직 등 중수가 되기 위한 필수 스킬들!
플레이스토어에 앱을 올렸을 시 스플래시 화면에서 안넘어가는 이슈
안녕하세요! 안드로이드 스튜디오에서 apk를 릴리즈용으로 만들어서 실행시킬때는 정상 동작을 확인했는데요, playstore에 올렸을때는 정상 동작을 안하는 버그가 있습니다. 어디서부터 뭐가 잘못됬는지를 알수가 없어서 질문 올립니다 ㅜㅜ 현재 playstore에 앱 번들을 업로드 한 상태입니다.여기서 다운로드해서 실행 시 이런 스플레시 화면에서 안넘어가는데 도무지 어디서부터 체크해야할지 모르겠어서 답답한 상황입니다.. 혹시 이런 경우를 보셨다면 말씀주시면 정말 도움이 될 것 같습니다. 감사합니다 이유는 알수없지만 redirectLogic 혹은 ref.listen<UserModelBase?>(userMeProvider, (previous, next) { if (previous != next) { notifyListeners(); } });요게 잘 안되고있는것 같은데.. 어렵네요.. 초기 페이지를 login으로 하면 잘됩니다 ㅜ
-
미해결[코드팩토리] [중급] Flutter 진짜 실전! 상태관리, 캐시관리, Code Generation, GoRouter, 인증로직 등 중수가 되기 위한 필수 스킬들!
postman test 항목이 없습니다.
강의를 진행하던 도중에 tests 항목에 환경세팅을 해줘야하는 부분이 있는데 현재 포스트 맨에서 tests 항목이 보이지 않습니다. 추가를 해줘야되는 부분인가요? 아니면 업데이트 되서 없어진건지.. 여쭈어보려고 합니다.
-
미해결[코드팩토리] [중급] Flutter 진짜 실전! 상태관리, 캐시관리, Code Generation, GoRouter, 인증로직 등 중수가 되기 위한 필수 스킬들!
restaurant_provider 부분에서 에러가 발생합니다.
final resp = await repository.paginate( paginationParams: paginationParams, );해당 부분에서The argument type 'PaginationParams' can't be assigned to the parameter type 'PaginationParams? 가 발생하는데요 타입이 불일치 하다는 것 같은데제가 repository의 paginate 코드랑 pagination_params 코드도 다시 확인해 보고 강사님 깃에 올라온 코드랑 비교도 해봤는데 왜 에러가 발생하는지 모르겠네요paginationParams: paginationParams!,paginationParams: paginationParams ?? const PaginationParams(),이런식으로 바꿔봐도 똑같습니다.아래는 제 repository 및 pagination_params 코드입니다.import 'package:basic_ui/common/dio/dio.dart'; import 'package:basic_ui/common/model/pagination_params.dart'; import 'package:basic_ui/common/model/cursor_pagination_model.dart'; import 'package:basic_ui/restaurant/model/restaurant_detail_model.dart'; import 'package:basic_ui/restaurant/model/restaurant_model.dart'; import 'package:dio/dio.dart' hide Headers; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:retrofit/http.dart'; import '../../common/const/data.dart'; part 'restaurant_repository.g.dart'; final restaurantRepositoryProvider = Provider<RestaurantRepository>( (ref) { final dio = ref.watch(dioProvider); final repository = RestaurantRepository(dio, baseUrl: 'http://$ip/restaurant'); return repository; }, ); @RestApi() abstract class RestaurantRepository { factory RestaurantRepository(Dio dio, {String baseUrl}) = _RestaurantRepository; @GET('/') @Headers({ 'accessToken': 'true', }) Future<CursorPagination<RestaurantModel>> paginate({ @Queries() PaginationParams? paginationParams = const PaginationParams(), }); @GET('/{id}') @Headers({ 'accessToken': 'true', }) Future<RestaurantDetailModel> getRestaurantDetail({ @Path() required String id, }); }import 'package:json_annotation/json_annotation.dart'; part 'pagination_params.g.dart'; @JsonSerializable() class PaginationParams { final String? after; final int? count; const PaginationParams({ this.after, this.count, }); PaginationParams copyWith({ String? after, int? count, }) { return PaginationParams( after: after ?? this.after, count: count ?? this.count, ); } factory PaginationParams.fromJson(Map<String, dynamic> json) => _$PaginationParamsFromJson(json); Map<String, dynamic> toJson() => _$PaginationParamsToJson(this); }
-
미해결[코드팩토리] [중급] Flutter 진짜 실전! 상태관리, 캐시관리, Code Generation, GoRouter, 인증로직 등 중수가 되기 위한 필수 스킬들!
Login_Screen에서의 상태관리에 대한 질문입니다
안녕하세요~ 강의를 다 듣고 나니 질문이 있습니다login screen의 상태관리에 대한 질문인데요! id, pw를 강의에서는 그냥String username = ''; String password = '';로 View내부에 선언하고 TextField의 onChanged를 통해서 저 값들을 변경하고 ref .read(userMeProvider.notifier) .login(username: username, password: password);이런식으로 넘겨주었는데,username, password 값도 상태관리를 하려면 또 이거에 관련된 프로바이더를 만들어야 하는건가요?? 추가로 id, pw값에 따라 button을 enabled - disabled 시키려면 또 이거와 관련된 프로바이더를 추가로 만들어야 하는건가요?? 이런식으로 하면 한 화면에서도 프로바이더가 굉장히 많이 만들어지게 되는데 이런 방식이 맞는지 궁금합니다..또 그 화면에서만 쓰는데도 전역으로 프로바이더들이 굉장히 많이 선언될거같아요.. 강의에서는 되게 굵직굵직한 data들을 전역 provider로 만들어서 굉장히 편했는데,앱을 개발하다보면 그 화면에서만 필요한 데이터들도 많을거고 단순히 버튼 상태처럼 bool값도 엄청 많을텐데 추후 테스트를 위해서 로직을 분리하려면이런것도 싹 다 프로바이더로 만들어야 하는것인가요..?
-
미해결[코드팩토리] [중급] Flutter 진짜 실전! 상태관리, 캐시관리, Code Generation, GoRouter, 인증로직 등 중수가 되기 위한 필수 스킬들!
리프레시 토큰이 만료될 때 AlertDialog를 그리고 싶습니다.
리프레시 토큰이 만료될 때 바로 login screen으로 이동하는 것이 아니라 다이얼로그를 띄운 후 확인 버튼을 누르면 화면 이동을 하고 싶은데 이 showDialog를 어디서 해야 할지 난관에 빠졌습니다. 현재는 리프레시가 만료되면dio interceptor에서 authProvider의 logout() 을 통해userMeProvider의 logout()을 호출해 state를 null로 만들고,goRouter가 state가 null이면 바로 로그인 스크린으로 redirect 시키고 있는데이 흐름이 뷰에서 이루어지는 것이 아니라서 context가 필요한 showDialog를 어느 부분에서 구현해야 할지 감이 안 잡힙니다.state를 null로 만들기 전에 다이얼로그를 띄우려면AuthProvider에서 userMeProvider의 logout를 호출하기 전에 실행되어야 할 것 같기도 한데 logout() { // showDialog()??? ref.read(userMeProvider.notifier).logout(); }결국 view단에서 호출하는 것이 아니기 때문에 context를 얻어올 방법이 떠오르지 않네요...
-
미해결[코드팩토리] [중급] Flutter 진짜 실전! 상태관리, 캐시관리, Code Generation, GoRouter, 인증로직 등 중수가 되기 위한 필수 스킬들!
styleFrom() 에서 primary 가 Deprecated 된 것
안녕하세요. 코팩님 초급 강의 듣다가 이제 중급으로 과감히 넘어온 수강생입니다 ! 첫번째 챕터를 하면서 styleFrom() 에서 막혔는데, 질문들 훑어 보고 한 번 해결해 봤는데 이대로 강의에 적용하면 되나요? ElevatedButton( onPressed: () {}, style: ElevatedButton.styleFrom( foregroundColor: PRIMARY_COLOR, ), child: Text('로그인'), ), TextButton( onPressed: () {}, style: TextButton.styleFrom( foregroundColor: Colors.black, ), child: Text('회원가입'), ),그리고, IOS랑 Android는 버튼 색감 자체가 차이가 있는 거기 때문에 색감 같은거는 앞으로 감안하면서 들으면 되는 건지요 ?? ㅎㅎ
-
미해결[코드팩토리] [중급] Flutter 진짜 실전! 상태관리, 캐시관리, Code Generation, GoRouter, 인증로직 등 중수가 되기 위한 필수 스킬들!
navigation bar 밑에 widget 띄울 방법 질문드립니다.
제가 개인 어플을 만들고 있는데요. 하단 Navi bar 밑의 공간에 배너로 띄울 생각입니다. 그런데 navi bar 밑에 배너로 띄울 방법이 생각나지 않아서 방법을 아신다면 공유해주시면 감사하겟습니다!
-
미해결[코드팩토리] [중급] Flutter 진짜 실전! 상태관리, 캐시관리, Code Generation, GoRouter, 인증로직 등 중수가 되기 위한 필수 스킬들!
SkeletonParagraph()에 관한 질문입니다.
안녕하세요."Skeleton 사용하기"의 강의 내용을 구현하고 있습니다.pubspec.yamldependencies: flutter: sdk: flutter # The following adds the Cupertino Icons font to your application. # Use with the CupertinoIcons class for iOS style icons. cupertino_icons: ^1.0.6 dio: ^5.5.0+1 flutter_secure_storage: ^9.2.2 json_annotation: ^4.9.0 retrofit: '>=4.0.0 <5.0.0' logger: any #for logging purpose flutter_riverpod: ^2.5.1 riverpod_annotation: ^2.3.5 skeletons: ^0.0.3restaurant_detail_screen.dart에서import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:skeletons/skeletons.dart'; return DefaultLayout( title: '불타는 떡볶이', child: CustomScrollView( slivers: [ renderTop( model: state, ), renderLoading(), // if (state is RestaurantDetailModel) renderLabel(), // if (state is RestaurantDetailModel) // renderProducts( // products: state.products, // ), ], ), ); }// SkeletonParagraph Logic SliverPadding renderLoading() { return SliverPadding( padding: EdgeInsets.symmetric( horizontal: 16.0, ), sliver: SliverList( delegate: SliverChildListDelegate( List.generate( 3, (index) => SkeletonParagraph( style: SkeletonParagraphStyle( lines: 5, ), ), ), ), ), ); }을 구현하고 재실행하면 다음과 같은 에러가 발생하고 있습니다.Skeleton용하기이미지가 작아서 텍스트로 붙여넣었습니다.Launching lib\main.dart on sdk gphone64 x86 64 in debug mode...Running Gradle task 'assembleDebug'...../../../../AppData/Local/Pub/Cache/hosted/pub.dev/skeletons-0.0.3/lib/src/widgets.dart:56:42: Error: The getter 'backgroundColor' isn't defined for the class 'ThemeData'. - 'ThemeData' is from 'package:flutter/src/material/theme_data.dart' ('/C:/flutter/packages/flutter/lib/src/material/theme_data.dart').Try correcting the name to the name of an existing getter, or defining a getter or field named 'backgroundColor'. color: Theme.of(context).backgroundColor, ^^^^^^^^^^^^^^^../../../../AppData/Local/Pub/Cache/hosted/pub.dev/skeletons-0.0.3/lib/src/widgets.dart💯46: Error: The getter 'backgroundColor' isn't defined for the class 'ThemeData'. - 'ThemeData' is from 'package:flutter/src/material/theme_data.dart' ('/C:/flutter/packages/flutter/lib/src/material/theme_data.dart').Try correcting the name to the name of an existing getter, or defining a getter or field named 'backgroundColor'. color: Theme.of(context).backgroundColor, ^^^^^^^^^^^^^^^Target kernel_snapshot failed: Exception여러가지로 찾아보았지만, 해결되지 않았습니다.이 문제에 대한 해결 방법에 대해 질문을 드립니다.감사합니다.
-
미해결[코드팩토리] [중급] Flutter 진짜 실전! 상태관리, 캐시관리, Code Generation, GoRouter, 인증로직 등 중수가 되기 위한 필수 스킬들!
로그아웃 시 캐시 삭제
logout 로직 실행 시 강의에서는 storage만 삭제하는데 provider들의 캐시는 지워야 하는게 맞는지궁금해서 질문 드립니다. 아니면 user와 연동된 장바구니와 주문 프로바이더 캐시만 null로 만들어야 할까요?? 추가로 만약 캐시를 지운다면userMeProvider에서 ref를 받아와 각 프로바이더 state를null로 바꿔버리면 되나요?
-
미해결[코드팩토리] [중급] Flutter 진짜 실전! 상태관리, 캐시관리, Code Generation, GoRouter, 인증로직 등 중수가 되기 위한 필수 스킬들!
paginationParams 파라미터 추가 등.
23년 5월에 비슷한 질문이 있었습니다.개인적으로 답하신듯해서 질문 드려봅니다.질문1.paginationParams의 count 값을각 메뉴에서 변경하려 하는데 현재 강의 소스에서는 어디부분을 확인해야 하는지요? 질문2.paginationParams에서 강의내용에 있는 after, count외에 다른..예를 들면 검색조건의 값을 받을 수 있게 하려면 어떻게 풀어야 하나요?강의내용에 있는 DB를 가지고 할 건 아니고,응용해서 별도로 해보다 보니.. 문의드립니다.
-
미해결[코드팩토리] [중급] Flutter 진짜 실전! 상태관리, 캐시관리, Code Generation, GoRouter, 인증로직 등 중수가 되기 위한 필수 스킬들!
로그인 로딩 중 버튼 비활성화 관련 질문입니다.
riverpod 상태 관리 시watch 메서드를 통해 view를 변경하는데userMeProvider를 watch하지 않고로그인 버튼의 onPressed 내에서 read로 상태를 읽어도비활성화가 잘 작동합니다.제가 이해한 바로는 userMeProvider가 생성될 때 생성자의 getMe 메서드를 통해서 상태는 null이 되어있을텐데어떻게 로그인 버튼을 누른 후 상태가 UserModelLoading으로 바뀌었을 때 view가 이를 감지하고 버튼을 disable시키는지 이해가 되지 않아 질문드립니다. 현재 로그인 스크린은 ConsumerStateFul 위젯입니다.ConsumerWidget으로 변경해도 잘 작동합니다. ElevatedButton( onPressed: ref.read(userMeProvider) is UserModelLoading ? null : () => ref .read(userMeProvider.notifier) .login( username: username, password: password, ) .then( (value) { if (value is! UserModelError) return; ScaffoldMessenger.of(context).showSnackBar( SnackBar( content: Text(value.message), duration: Duration(seconds: 1), ), ); }, ), child: const Text('로그인'), ),
-
해결됨[코드팩토리] [중급] Flutter 진짜 실전! 상태관리, 캐시관리, Code Generation, GoRouter, 인증로직 등 중수가 되기 위한 필수 스킬들!
"Restaurant Pagination 요청해보기" 09:45에서 일시적으로 snapshot.hasData:: false 가 나오는 현상에 대한 질문입니다.
안녕하세요."Restaurant Pagination 요청해보기" 09:45까지 선생님의 강의 따라서 잘 진행하고 있습니다.restaurant_screen.dart의 FutureBuilder<List> 내부에서 snapshot.hasData를 print하면 다음과 같은 결과를 얻었습니다.실행환경은 윈도우의 안드로이드 스튜디오를 사용하고 있습니다.log fileI/flutter (10452): -------- in RestaurantScreen --------I/flutter (10452): snapshot.error:: nullI/flutter (10452): snapshot.data:: nullI/flutter (10452): snapshot.hasData:: falseW/WindowOnBackDispatcher(10452): sendCancelIfRunning: isInProgress=false callback=io.flutter.embedding.android.FlutterActivity$1@a3bcdaaD/EGL_emulation(10452): app_time_stats: avg=24.92ms min=12.78ms max=289.52ms count=40I/flutter (10452): -------- in RestaurantScreen --------I/flutter (10452): snapshot.error:: nullI/flutter (10452): snapshot.data:: [{id: 5ac83bfb-f2b5-55f4-be3c-564be3f01a5b, name: 불타는 떡볶이, thumbUrl: /img/떡볶이/떡볶이.jpg, tags: [떡볶이, 치즈, 매운맛], priceRange: medium, ratings: 4.53, ratingsCount: 100, deliveryTime: 15, deliveryFee: 2000}, {id: 15480ad3-892f-50ce-ab39-540c34c6fb5a, name: 매콤 멕시칸, thumbUrl: /img/멕시칸/야채타코.jpg, tags: [멕시칸, 매콤, 할라피뇨], priceRange: expensive, ratings: 4.54, ratingsCount: 100, deliveryTime: 30, deliveryFee: 0}, {id: cf11d36a-7c61-5105-8306-5c8c7ff2c140, name: 엄마손 볶음밥, thumbUrl: /img/볶음밥/새우볶음밥.jpg, tags: [분식, 볶음밥, 김치], priceRange: cheap, ratings: 4.53, ratingsCount: 100, deliveryTime: 20, deliveryFee: 3000}, {id: 4729bd37-8927-5150-b036-395da7e7bb42, name: 신선 코팩 스시, thumbUrl: /img/스시/중간모듬스시.jpg, tags: [스시, 일식, 연어], priceRange: expensive, ratings: 4.54, ratingsCount: 100, deliveryTime: 30, deliveryFee: 0}, {id: 4fcf09a5-03ee-5a2e-9806-110285030c8I/flutter (10452): snapshot.hasData:: true잠시, if (!snapshot.hasData) { return Container(); }위 코드가 실행이 되고, 또 다시 RestaurantScreen Class가 호출되어 return ListView.separated() 로직이 실행되는 것 같습니다.SplashScreen Class의 initState() 함수에서 RootTab Class로 호출하고,RootTab Class에서 RestaurantScreen Class를 호출하는 로직으로 파악되데 원인을 잘 모르겠습니다.감사합니다.
-
미해결[코드팩토리] [중급] Flutter 진짜 실전! 상태관리, 캐시관리, Code Generation, GoRouter, 인증로직 등 중수가 되기 위한 필수 스킬들!
styleForm에서 primary는 Deprecated 됐네요
https://docs.flutter.dev/release/breaking-changes/3-16-deprecations
-
미해결[코드팩토리] [중급] Flutter 진짜 실전! 상태관리, 캐시관리, Code Generation, GoRouter, 인증로직 등 중수가 되기 위한 필수 스킬들!
Go router 를 이용한 Nested Navigation 질문 입니다.
Appbar 에는 progress bar 를 넣고, app bar 를 그대로 남겨둔채로 여러 페이지를 이동할 수 있는 UI 를 구현하고자 하는데, 이런 Nested Navigation 은 일반적으로 ShellRoute 를 이용해서 구현하면 되는 것이 맞는지 혹은 다른 best practice 가 있는지 궁금합니다! 선생님께서는 이런 경우에 어떤 방식을 이용하시나요?좋은 강의 감사드립니다.
-
미해결[코드팩토리] [중급] Flutter 진짜 실전! 상태관리, 캐시관리, Code Generation, GoRouter, 인증로직 등 중수가 되기 위한 필수 스킬들!
섹션 10, restaurantDetail 캐싱하기 질문입니다.
안녕하세요. 제가 해당 섹션을 이해한바로는 getDetail 함수에서 메인스크린에서 식당을 클릭할때 들어오는 것 뿐만아니라, 식당 디테일 페이지 단독으로 실행할 때도 잘 작동하게끔 구현한걸로 아는데,데이터(CursorPagination)가 아얘 없을 때 this.paginate()를 한번 실행해서 처음 20개의 식당 데이터를 가져오고 이후 id 에 해당하는 getRestaurantDetail을 호출해서 해당 식당 정보를 가져온후 마지막에 map 으로 그 식당 id 에 해당하는 데이터를 교체하는 형식으로 진행한는데,애초에 this.paginate() 에서 가져온 20개의 식당 범위 밖에 식당이라면, getRestaurantDetail 로 식당정보를 가져오더라도 똑같은 식당 id를 찾을 수 없어서 교체할 수 없는 것 아닌지 질문드립니다.
-
미해결[코드팩토리] [중급] Flutter 진짜 실전! 상태관리, 캐시관리, Code Generation, GoRouter, 인증로직 등 중수가 되기 위한 필수 스킬들!
빌드파일질문
강사님 안녕하세요\다름이 아니라 flutter_secure_storage를 추가하고 빌드파일에서 minSdkVersion 부분에 18을 추가하고 재시작을 하니 오류가 생겼습니다.그래서 minSdkVersion에 18을 지우고 재시작을 하니 정상동작하였습니다. 18을 작성하니 오류가 뜨는 이유가 무엇인가요?Launching lib\main.dart on SM S918N in debug mode...FAILURE: Build failed with an exception.* Where:Build file 'C:\Users\DongHan\AndroidStudioProjects\project\delivery_front\android\app\build.gradle' line: 41* What went wrong:A problem occurred evaluating project ':app'.> Could not find method minSdkVersion() for arguments [18] on extension 'flutter' of type FlutterExtension.* Try:> Run with --stacktrace option to get the stack trace.> Run with --info or --debug option to get more log output.> Run with --scan to get full insights.* Get more help at https://help.gradle.orgBUILD FAILED in 2sRunning Gradle task 'assembleDebug'... 3.7sError: Gradle task assembleDebug failed with exit code 1minSdkVersion을 18로 설정하고 재실행 했을떄의 오류 로그입니다plugins { id "com.android.application" id "kotlin-android" // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. id "dev.flutter.flutter-gradle-plugin" } def localProperties = new Properties() def localPropertiesFile = rootProject.file("local.properties") if (localPropertiesFile.exists()) { localPropertiesFile.withReader("UTF-8") { reader -> localProperties.load(reader) } } def flutterVersionCode = localProperties.getProperty("flutter.versionCode") if (flutterVersionCode == null) { flutterVersionCode = "1" } def flutterVersionName = localProperties.getProperty("flutter.versionName") if (flutterVersionName == null) { flutterVersionName = "1.0" } android { namespace = "com.example.delivery" compileSdk = flutter.compileSdkVersion ndkVersion = flutter.ndkVersion compileOptions { sourceCompatibility = JavaVersion.VERSION_1_8 targetCompatibility = JavaVersion.VERSION_1_8 } defaultConfig { // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). applicationId = "com.example.delivery" // You can update the following values to match your application needs. // For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-gradle-build-configuration. minSdk = flutter.minSdkVersion targetSdk = flutter.targetSdkVersion versionCode = flutterVersionCode.toInteger() versionName = flutterVersionName } buildTypes { release { // TODO: Add your own signing config for the release build. // Signing with the debug keys for now, so `flutter run --release` works. signingConfig = signingConfigs.debug } } } flutter { source = "../.." } 위 파일은 android/app/build.gradle 파일입니다.
-
미해결[코드팩토리] [중급] Flutter 진짜 실전! 상태관리, 캐시관리, Code Generation, GoRouter, 인증로직 등 중수가 되기 위한 필수 스킬들!
로그인에러
안녕하세요. 코펙님.이번에 중급강의로 넘어오면서 에러가 해결되지 않아 질문드립니다. 일단 저는 지금 노트북에서 갤럭시기기 연결해서 공부중입니다. E/flutter ( 6917): [ERROR:flutter/runtime/dart_vm_initializer.cc(41)] Unhandled Exception: DioError [DioErrorType.other]: SocketException: Connection refused (OS Error: Connection refused, errno = 111), address = 192.168.1.10, port = 36410로그인 버튼을 클릭 시 위의 에러가 표시됩니다. ip주소도 콘솔에서 찾아서 변경하였지만, 안되었고...삽질을 1시간 정도 하였지만 도저히 이유를 모르겠어서 게시판에 글을 남깁니다.그리고 제가 dio의 버전이 처음에는 최신버전으로 했지만 혹시 강의버전과 일치하지 않아서 생기는 오류가 아닐까? 하고 프로젝트를 새로 생성해 dio버전을 맞추어서 실행하니 E/flutter ( 6917): [ERROR:flutter/runtime/dart_vm_initializer.cc(41)] Unhandled Exception: DioError [DioErrorType.other]: SocketException: Connection refused (OS Error: Connection refused, errno = 111), address = 192.168.1.10, port = 48142E/flutter ( 6917): Source stack:E/flutter ( 6917): #0 DioMixin.fetch (package:dio/src/dio_mixin.dart:488:35)E/flutter ( 6917): #1 DioMixin.request (package:dio/src/dio_mixin.dart:483:12)E/flutter ( 6917): #2 DioMixin.post (package:dio/src/dio_mixin.dart:97:12)E/flutter ( 6917): #3 LoginScreen.build.<anonymous closure> (package:delivery2/user/view/login_screen.dart:65:44)E/flutter ( 6917): #4 InkResponseState.handleTap (package:flutter/src/material/inkwell.dart:1171:21)E/flutter ( 6917): #5 GestureRecognizer.invokeCallback (package:flutter/src/gestures/recognizer.dart:344:24)E/flutter ( 6917): #6 TapGestureRecognizer.handleTapUp (package:flutter/src/gestures/tap.dart:652:11)E/flutter ( 6917): #7 BaseTapGestureRecognizer._checkUp (package:flutter/src/gestures/tap.dart:309:5)E/flutter ( 6917): #8 BaseTapGestureRecognizer.handlePrimaryPointer (package:flutter/src/gestures/tap.dart:242:7)E/flutter ( 6917): #9 PrimaryPointerGestureRecognizer.handleEvent (package:flutter/src/gestures/recognizer.dart:696:9)E/flutter ( 6917): #10 PointerRouter._dispatch (package:flutter/src/gestures/pointer_router.dart:98:12)E/flutter ( 6917): #11 PointerRouter._dispatchEventToRoutes.<anonymous closure> (package:flutter/src/gestures/pointer_router.dart:143:9)E/flutter ( 6917): #12 LinkedHashMapMixin.forEach (dart:collection-patch/compacthash.dart:633:13)E/flutter ( 6917): #13 PointerRouter._dispatchEventToRoutes (package:flutter/src/gestures/pointer_router.dart:141:18)E/flutter ( 6917): #14 PointerRouter.route (package:flutter/src/gestures/pointer_router.dart:127:7)E/flutter ( 6917): #15 GestureBinding.handleEvent (package:flutter/src/gestures/binding.dart:495:19)E/flutter ( 6917): #16 GestureBinding.dispatchEvent (package:flutter/src/gestures/binding.dart:475:22)E/flutter ( 6917): #17 RendererBinding.dispatchEvent (package:flutter/src/rendering/binding.dart:425:11)E/flutter ( 6917): #18 GestureBinding._handlePointerEventImmediately (package:flutter/src/gestures/binding.dart:420:7)E/flutter ( 6917): #19 GestureBinding.handlePointerEvent (package:flutter/src/gestures/binding.dart:383:5)E/flutter ( 6917): #20 GestureBinding._flushPointerEventQueue (package:flutter/src/gestures/binding.dart:330:7)E/flutter ( 6917): #21 GestureBinding._handlePointerDataPacket (package:flutter/src/gestures/binding.dart:299:9)E/flutter ( 6917): #22 _invoke1 (dart:ui/hooks.dart:328:13)E/flutter ( 6917): #23 PlatformDispatcher._dispatchPointerDataPacket (dart:ui/platform_dispatcher.dart:442:7)E/flutter ( 6917): #24 _dispatchPointerDataPacket (dart:ui/hooks.dart:262:31)E/flutter ( 6917):E/flutter ( 6917): #0 DioMixin.fetch.<anonymous closure> (package:dio/src/dio_mixin.dart:643:7)E/flutter ( 6917): #1 _RootZone.runBinary (dart:async/zone.dart:1666:54)E/flutter ( 6917): #2 FutureListener.handleError (dart:async/futureimpl.dart:178:22)E/flutter ( 6917): #3 Future._propagateToListeners.handleError (dart:async/future_impl.dart:859:47)E/flutter ( 6917): #4 Future._propagateToListeners (dart:async/future_impl.dart:880:13)E/flutter ( 6917): #5 Future._completeError (dart:async/future_impl.dart:660:5)E/flutter ( 6917): #6 SyncCompleter.completeError (dart:async/future_impl.dart:63:12)E/flutter ( 6917): #7 Completer.completeError (dart:async/futureimpl.dart:27:5)E/flutter ( 6917): #8 Future.any.onError (dart:async/future.dart:623:45)E/flutter ( 6917): #9 _RootZone.runBinary (dart:async/zone.dart:1666:54)E/flutter ( 6917): #10 FutureListener.handleError (dart:async/futureimpl.dart:178:22)E/flutter ( 6917): #11 Future._propagateToListeners.handleError (dart:async/future_impl.dart:859:47)E/flutter ( 6917): #12 Future._propagateToListeners (dart:async/future_impl.dart:880:13)E/flutter ( 6917): #13 Future._completeError (dart:async/future_impl.dart:660:5)E/flutter ( 6917): #14 Future._asyncCompleteError.<anonymous closure> (dart:async/future_impl.dart:746:7)E/flutter ( 6917): #15 microtaskLoop (dart:async/schedulemicrotask.dart:40:21)E/flutter ( 6917): #16 startMicrotaskLoop (dart:async/schedulemicrotask.dart:49:5)E/flutter ( 6917):위의 오류가 발생하였습니다. 일단. 갤럭시 기기를 실제로 연동해서 강의를 진행하고 싶은 마음이 있어서 게시판에 글을 남깁니다.감사합니다
-
해결됨[코드팩토리] [중급] Flutter 진짜 실전! 상태관리, 캐시관리, Code Generation, GoRouter, 인증로직 등 중수가 되기 위한 필수 스킬들!
스켈레톤 사용 불가
현재 제가 사용하고 있는 플러터 버전(3.22 stable)에서Theme.of(context).backgroundColor가 deprecated 된 것 같은데 스켈레톤 라이브러리 가장 최신버젼에서 해당 코드를 사용하고 있어 라이브러리를 땡겼을 시 에러가 나는 것같습니다.제가 잘못 알고 있는 부분이 있다면 알려주시면감사하겠습니다!