묻고 답해요
158만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨[코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!
Section 26 RtcEngine initialize 에러(해결은 했습니다!)
채널 입장하고 권한 체크 후 앱이 꺼지고 Debug 콘솔에 아래 같은 로그가 뜨길래 한참 헤맸습니다.코드 한 줄씩 지워가며 어디서 에러가 뜨는지 확인해보니 await engine!.initialize(RtcEngineContext(appId: appId,)); 코드가 들어가는 순간 앱이 꺼지더라구요해당 부분을 집중해서 검색하다가 발견한 방법대로 RtcEngine 선언 부분에 late 를 넣어주니 앱이 꺼지지 않았습니다. 혹시 원인을 알 수 있을까요?에러 로그D/EGL_emulation( 2046): app_time_stats: avg=10745.24ms min=12.90ms max=31961.13ms count=3 D/nativeloader( 2046): Load /data/app/~~nTLNP9Bj_egzZU9DQGxSrQ==/com.example.video_call-LRfYUQJyccQppChea-IfMw==/lib/arm64/libAgoraRtcWrapper.so using ns clns-7 from class loader (caller=/data/app/~~nTLNP9Bj_egzZU9DQGxSrQ==/com.example.video_call-LRfYUQJyccQppChea-IfMw==/base.apk!classes2.dex): dlopen failed: empty/missing DT_HASH/DT_GNU_HASH in "/data/app/~~nTLNP9Bj_egzZU9DQGxSrQ==/com.example.video_call-LRfYUQJyccQppChea-IfMw==/lib/arm64/libAgoraRtcWrapper.so" (new hash type from the future?) E/AndroidRuntime( 2046): FATAL EXCEPTION: main E/AndroidRuntime( 2046): Process: com.example.video_call, PID: 2046 E/AndroidRuntime( 2046): java.lang.UnsatisfiedLinkError: dlopen failed: empty/missing DT_HASH/DT_GNU_HASH in "/data/app/~~nTLNP9Bj_egzZU9DQGxSrQ==/com.example.video_call-LRfYUQJyccQppChea-IfMw==/lib/arm64/libAgoraRtcWrapper.so" (new hash type from the future?) E/AndroidRuntime( 2046): at java.lang.Runtime.loadLibrary0(Runtime.java:1081) E/AndroidRuntime( 2046): at java.lang.Runtime.loadLibrary0(Runtime.java:1003) E/AndroidRuntime( 2046): at java.lang.System.loadLibrary(System.java:1765) E/AndroidRuntime( 2046): at io.agora.agora_rtc_ng.AgoraRtcNgPlugin.onMethodCall(AgoraRtcNgPlugin.java:65) E/AndroidRuntime( 2046): at io.flutter.plugin.common.MethodChannel$IncomingMethodCallHandler.onMessage(MethodChannel.java:267) E/AndroidRuntime( 2046): at io.flutter.embedding.engine.dart.DartMessenger.invokeHandler(DartMessenger.java:292) E/AndroidRuntime( 2046): at io.flutter.embedding.engine.dart.DartMessenger.lambda$dispatchMessageToQueue$0$io-flutter-embedding-engine-dart-DartMessenger(DartMessenger.java:319) E/AndroidRuntime( 2046): at io.flutter.embedding.engine.dart.DartMessenger$$ExternalSyntheticLambda0.run(Unknown Source:12) E/AndroidRuntime( 2046): at android.os.Handler.handleCallback(Handler.java:959) E/AndroidRuntime( 2046): at android.os.Handler.dispatchMessage(Handler.java:100) E/AndroidRuntime( 2046): at android.os.Looper.loopOnce(Looper.java:232) E/AndroidRuntime( 2046): at android.os.Looper.loop(Looper.java:317) E/AndroidRuntime( 2046): at android.app.ActivityThread.main(ActivityThread.java:8705) E/AndroidRuntime( 2046): at java.lang.reflect.Method.invoke(Native Method) E/AndroidRuntime( 2046): at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:580) E/AndroidRuntime( 2046): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:886) I/Process ( 2046): Sending signal. PID: 2046 SIG: 9 Lost connection to device. the Dart compiler exited unexpectedly.해결했던 방법late RtcEngine? engine; //선언할 때 late 추가
-
미해결[코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!
Web_view flutter 4.9.0을 설치후 에러
iOS 디바이스로 디버그 실행하면러 자꾸 위와같은 에러가 떠서 진행이 안되네요…왜 그럴까요?
-
미해결[코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!
retrofit을 사용한 통신 시 content type 관련하여 문의
안녕하세요. 강의에 없는 내용이지만, 검색을 며칠 째 하고 있으나 해결방법을 못 찾아서 이렇게 문의드립니다. 양해부탁드립니다.. flutter에서 retrofit을 사용하여 multipartforamdata 형식의 api를 호출할 때, application/json으로 보내야 하는 객체는 content type을 어떻게 지정해주어야 하는 걸까요? springBoot와 flutter로 개발 진행 중이고, api와 flutter는 각각 아래와 같이 작성하였습니다.// api @PostMapping(path = "", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) public void temp(@RequestPart TempReq, @RequestPart List<MultipartFile> files) { // 생략 } // flutter에서 api 호출부 @POST('') @MultiPart() Future<void> temp(@Part() TempReq req, @Part() List<MultipartFile> files);flutter에서 api 호출 시 content type 'application/octet-stream' not supported 에러가 발생합니다.postman이나 swagger로 테스트 했을 땐 정상적으로 동작하는 걸 보면 api 문제는 아닌듯합니다.flutter에서 호출할 때도 files는 잘 들어오는데, TempReq 객체를 받을 때가 문제인 듯합니다. @Part 안에 content type을 application/json으로 지정해보았는데도 동일한 에러가 발생합니다.
-
미해결[코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!
Align 과 Center 위젯 차이
비디오 플레이어 제작하실때비디오 위에 올라올 아이콘 정렬을 위해서 Align() 위젯을 사용하셨는데Center() 위젯도 똑같이 영상의 가운데로 정렬이 되던데 혹시 Align() 위젯을 사용하신 이유가 따로 있을까요?
-
미해결[코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!
[섹션11] 웹사이트 웹뷰에 띄우기 질문입니다.
안녕하세요 🙂 프로그래밍 초보이지만,플러터 강의 덕분에 즐겁게 공부하고 있습니다.아래 코드에서, https://blog.codefactory.ai 로 Uri를 연결했더니, 코드팩토리님 블로그로 잘 연결되는데요, final homeUrl = Uri.parse('https://blog.codefactory.ai'); class HomeScreen extends StatelessWidget { WebViewController controller = WebViewController()..loadRequest(homeUrl); HomeScreen({super.key}); 제가 처음에 오타로 https를 http로 입력했더니,오류가 발생하더라구요. 혹시 원인을 설명해주실 수 있나요?ㅜㅜ
-
해결됨Flutter 앱 개발 실전
Notion 자료 오타를 발견했습니다!
이해가 잘 되게 설명해주시고, 강의 자료도 너무 잘 정리해주셔서 강의 너무 잘 듣고 있습니다 😃 강의 자료에서 오타를 찾은 것 같아 전달드립니다~Dart -> 04.JSON & 직렬화 -> 직렬화 & 역직렬화 하단 직렬화, 역직렬화 코드에 "철수" 가 "철수 로 큰따옴표 하나가 입력안된 것 같아요! 강의 제공해주셔서 너무 감사합니다!
-
미해결[코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!
pushNamedAndRemoveUntil 의 작동원리와 오류나는 이유가 궁금합니다.
안녕하세요! 강의 잘 듣고 있습니다. Q1.pushNamedAndRemoveUntil 의 작동순서? 원리가 제가 생각한게 맞는지 확신이 들지 않아서 여쭤봅니다.명명된 라우트가 푸시된다.라우트 스택 중 가장 최근부터 순차적으로 조건문에 따라 false가 반환되는 라우트는 스택에서 삭제된다.따라서 push됐던 라우트에서 pop을 하게 되면 라우트 스택에 남아있던 라우트로 이동한다.이게 맞나요? Q2.라우트 스택의 가장 최근부터 순차적으로 삭제되는게 맞다면RemoveUntil 이라는 이름을 보고 삭제되지 않는 페이지가 있다면 거기서 끝나는건가? 라는 생각에 HomeScreen이 아닌 route_one_screen이 삭제되지 않는 조건문을 작성했습니다. route.settings.name == '/'; 로 하셨던 것을route.settings.name == '/one' 으로 바꿔봤는데push됐던 route_three_screen이 pop되면 route_one_screen이 나올줄 알았는데그냥 검은 화면만 나옵니다.무엇이 문제였던 걸까요..?그리고 home_screen도 삭제가 되었을까요? import 'package:flutter/material.dart'; import 'package:navigation/layout/default_layout.dart'; import 'package:navigation/screen/route_three_screen.dart'; class RouteTwoScreen extends StatelessWidget { const RouteTwoScreen({super.key}); @override Widget build(BuildContext context) { final arguments = ModalRoute.of(context)?.settings.arguments; return DefaultLayout( title: 'RouteTwoScreen', children: [ Text( arguments.toString(), textAlign: TextAlign.center, ), OutlinedButton( onPressed: () { Navigator.of(context).pop(); }, child: Text('Pop'), ), OutlinedButton( onPressed: () { Navigator.of(context).pushNamed( '/three', arguments: 111111, ); }, child: Text('Push Route Three'), ), OutlinedButton( onPressed: () { /// [HomeScreen, RouteOneScreen, RouteTwoScreen] /// push - [HomeScreen, RouteOneScreen, RouteTwoScreen, RouteThreeScreen] /// pushR - [HomeScreen, RouteOneScreen, RouteThreeScreen] Navigator.of(context).pushReplacement( MaterialPageRoute( builder: (BuildContext context) { return RouteThreeScreen(); }, settings: RouteSettings( arguments: 999, ), ), ); }, child: Text('Push Replacement'), ), OutlinedButton( onPressed: () { Navigator.of(context).pushReplacementNamed( '/three', arguments: 999, ); }, child: Text('Push Replacement Named'), ), OutlinedButton( onPressed: () { Navigator.of(context).pushNamedAndRemoveUntil( '/three', (route){ /// 만약에 삭제 할거면 (Route Stack) false 반환 /// 만약에 삭제를 안할거면 true 반환 return route.settings.name == '/one'; }, arguments: 999, ); }, child: Text('Push Named And Remove Until'), ), ], ); } }
-
해결됨[플러터플로우] 실전! 앱 출시를 위한 끝장 노하우!
강의 내용 중복
아래 두 강의 내용이 동일합니다. [인앱결제] 10. 플러터플로우-RevenueCat 연결 및 구현[인앱결제] 11. iOS에서 인앱결제 테스트하기
-
해결됨Flutter 앱 개발 실전
혹시 추가적인 강의는 아직 소식이 없는건가요?
강사님의 강의를 더 보고 싶은데 예정된 강의가 없나요 ㅠㅠ?클린아키텍쳐와 블록의 사용 등 다른 강의도 보고 싶은데 ㅠㅠ
-
미해결[코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!
LateInitializationError 발생
selectedColorId가 null일 때 빈 컨테이너를 반환하는 코드를 작성했음에도 불구하고 다음과 같은 에러가 발생합니다(동작은 정상적으로 되긴 합니다).LateInitializationError: Field 'selectedColorId' has not been initialized.
-
미해결[코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!
Drift 파일 안의 스키마 버전 업데이트?
int get schemaVersion => 1; // DataModel을 변경하면 버전을 올리고 배포 / 현재 원하는 상태인지 확인용데이터 모델을 저희가 새로 만들고 JOIN 시켜서 연동시키는데 실제 출시, 업데이트 환경에서는 방금과 같이 모델구조에 변화가 오는 상황에서 버전 관리 해주고 문서화 하는게 맞는 건가요?해당 스키마 버전이 실제 구동환경에는 영향이 없고 수업이라서 넘어간 상황인지 궁금합니다.
-
미해결[코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!
생성날짜를 테이블에 추가하는 이유?
안녕하세요 테이블 ID는 주 식별자로 불러와야하는거 이해했고색상 칼럼은 JOIN하기 위해 새로운 테이블의 값이라는거 이해했습니다그런데 생성 날짜는 왜 추가한건지 설명해주실수 있나요?이미 테이블 연동은 1:1로 ID 로 가능하고 가져오려고 하는 데이터는 색상값이기만 한걸로 이해했습니다.
-
해결됨Flutter로 SNS 앱 만들기
데스크탑에서 작업한 프로젝트 파일을 다른 컴퓨터에서 열어볼때 에러나가 나는 이유를 알고 싶어요
데스크탑에서 강의중인 작업한 프로젝트 파일을 노트북에서 열어볼때 에러나가 나는 이유를 알고 싶어요 주위에 도움 받을때가 없어서요.데트크탑 dart 3.5.1,flutter 3.24.1노트북 dart 3.4.3 flutter 3.22.2 노트북 setting에서Languages&Frameworks/ dart,flutter 설정을 제대로 되었습니다 근데 이렇게 에러는 어떻게 확인해야 합니까 노트북 dart와 flutter 이 같아야 하나요.강의질문가 달라서 지송합니다.강의 받다가 프로젝트를 다른곳에서 작업하게 되어서 ... ㅠㅠ
-
미해결플러터와 장고로 1시간만에 퀴즈 앱/서버 만들기 [무작정 풀스택]
24년 8월 기준,, SnackBar 부분 변경
ScaffoldMessenger.of(context).showSnackBar( SnackBar( content: Row( children: <Widget>[ const CircularProgressIndicator(), Padding(padding: EdgeInsets.only(left: width * 0.036), ), const Text("로딩중,,,") ], ), duration: const Duration( milliseconds: 300 ), ), );으로 변경됨
-
미해결[코드팩토리] [중급] 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 앱 개발 실전
Riverpod을 하려고 하는데 질문이 있습니다!
현재 강의에서 주로 사용하신 provider와 mvvm패턴을 활용해서 팀프로젝트와 개인프로젝트를 끝낸 상태입니다.근데 자꾸만 할수록 riverpod에 대한 필요성을 느끼게 되어서 상태관리를 바꿔보려고 생각중인데현재 강사님이 강의하신 내용으로도 충분할까요? 아니면 추가적인 강의나 학습이 필요할까요?제 계획은 1. 강사님이 짧게 다루신 riverpod에 대한 내용을 복습하고 깃허브에 작성하신 riverpod으로 적용된 쇼핑몰 프로젝트를 보면서 클론코딩을 해볼 생각입니다.이후에는 그걸 제 개인프로젝트에 적용할 생각이구요.그걸로 충분할까요?아니면 추가적인 학습 후에 1번과 2번을 하는 게 좋을까요?
-
미해결플러터와 장고로 1시간만에 퀴즈 앱/서버 만들기 [무작정 풀스택]
24년 8월 기준 flutter_swiper import 관련
flutter_swiper_view:로 변경되었음.
-
미해결플러터와 장고로 1시간만에 퀴즈 앱/서버 만들기 [무작정 풀스택]
24년 8월 기준,, 버튼 변경
24년에 퀴즈 앱 만들기 참여하신 분들께 도움이 되고자 남깁니다. 마지막 퀴즈 풀기 버튼 은 아래와 같이 변경되었습니다.child: ElevatedButton( style: ElevatedButton.styleFrom( foregroundColor: Colors.white, backgroundColor: Colors.deepPurple, ), onPressed: () {}, child: const Text( '지금 퀴즈 풀기', style: TextStyle(color: Colors.white), ), ),
-
해결됨Flutter 앱 개발 기초
Expanded 하니 에러가 나는데 이유를 모르겠습니다.
사진에 빨간 박스 부분 Expanded 하는데 정답 코드와 비슷한데 무슨 이유인지 에러가 나는데 잘 모르겠네요. Expanded 적용 전 코드Row( crossAxisAlignment: CrossAxisAlignment.end, children: [ Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ /// 11 ★ until next Reward Text( "11 ★ until next Reward", style: TextStyle( color: starbucksAccentColor, fontWeight: FontWeight.bold, fontSize: 16, ), ), /// 진행율 ], ), ...Expanded 적용 후 코드(일부분)Row( crossAxisAlignment: CrossAxisAlignment.end, children: [ Expanded( child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ /// 11 ★ until next Reward Text( "11 ★ until next Reward", style: TextStyle( color: starbucksAccentColor, fontWeight: FontWeight.bold, fontSize: 16, ), ), /// 진행율 ], ), ), ...전체코드import 'package:flutter/material.dart'; /// Starbucks 메인 색상 Color starbucksPrimaryColor = Color.fromARGB(255, 83, 184, 138); /// Starbucs 포인트 색상 Color starbucksAccentColor = Color.fromARGB(255, 199, 176, 121); class StarbucksHome extends StatelessWidget { const StarbucksHome({super.key}); @override Widget build(BuildContext context) { /// 배경 이미지 URL final String backImg = "https://i.ibb.co/2Pz33q7/2021-12-16-12-21-42-cleanup.png"; /// Frequency 이미지 URL final String frequencyImg = "https://i.ibb.co/QcVn97y/2021-12-16-1-33-11.png"; /// 추천 메뉴 final List<Map<String, String>> recommendMenu = const [ { "name": "돌체쿠키라떼", "imgUrl": "https://i.ibb.co/SwGPpzR/9200000003687-20211118142543832.jpg", }, { "name": "아이스 홀리데이 돌체 쿠키 라떼", "imgUrl": "https://i.ibb.co/JHVXZ72/9200000003690-20211118142702357.jpg", }, { "name": "스노우 민트 초콜릿", "imgUrl": "https://i.ibb.co/M91G17c/9200000003693-20211118142933650.jpg", }, { "name": "아이스 스노우 민트 초콜릿", "imgUrl": "https://i.ibb.co/jyZK4C9/9200000003696-20211118143125337.jpg", }, { "name": "스노우 민트 초콜릿 블렌디드", "imgUrl": "https://i.ibb.co/DKkV0rw/9200000003699-20211118143249044.jpg", }, ]; /// 크리스마스 이벤트 이미지 URL final String eventImg = "https://i.ibb.co/Fb0q43T/IMG-F9-BA5-CBCB476-1.jpg"; return Scaffold( body: CustomScrollView( slivers: [ /// Tip: 스크롤시 배경이 사라지게 할려면 SliverAppBar를 사용 SliverAppBar( // automaticallyImplyLeading: false, expandedHeight: 252, // 최대확장되었을때 높이 pinned: true, // 스크롤시 bottom 영역을 화면 상단에 고정할지 여부 snap: false, // 스크롤 중간에 멈출때 자동으로 AppBar를 펼쳐서 배경을 모두 보여줄지 여부 floating: true, // ?? backgroundColor: Colors.white, /// 스크롤시 사라지는 영역 flexibleSpace: FlexibleSpaceBar( collapseMode: CollapseMode.pin, background: Stack( children: [ /// 배경이미지 Positioned.fill( bottom: 60, child: Image.network( backImg, fit: BoxFit.cover, ), ), /// 배경 위 위젯 Positioned( top: 24, left: 24, bottom: 60, child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( "한 해의 마무리,\n수고 많았어요💖", style: TextStyle(fontSize: 28, fontWeight: FontWeight.bold), ), Row( crossAxisAlignment: CrossAxisAlignment.end, children: [ Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ /// 11 ★ until next Reward Text( "11 ★ until next Reward", style: TextStyle( color: starbucksAccentColor, fontWeight: FontWeight.bold, fontSize: 16, ), ), /// 진행율 ], ), /// 1/12 ★ RichText( text: TextSpan( children: [ TextSpan( text: '1', style: TextStyle( color: Colors.black, fontSize: 42, fontWeight: FontWeight.bold, ), ), TextSpan( text: ' / ', style: TextStyle( color: Colors.grey, fontSize: 28, fontWeight: FontWeight.bold, ), ), TextSpan( text: '12 ★', style: TextStyle( color: starbucksAccentColor, fontSize: 28, fontWeight: FontWeight.bold, ), ), ], ), ), ], ) ], ), ), ], ), ), /// 스크롤시 남아있는 영역 bottom: PreferredSize( preferredSize: Size.fromHeight(52), // 영역 높이 child: Container( height: 52, color: Colors.white, padding: EdgeInsets.only(left: 24, right: 12), child: Row( children: [ /// What's New GestureDetector( onTap: () {}, child: Row( children: [ Icon( Icons.mail_outline, color: Colors.grey, ), SizedBox(width: 8), Text( "What's New", style: TextStyle(fontSize: 18), ), ], ), ), SizedBox(width: 32), /// Coupon GestureDetector( onTap: () {}, child: Row( children: [ Icon( Icons.confirmation_num_outlined, color: Colors.grey, ), SizedBox(width: 8), Text( "Coupon", style: TextStyle(fontSize: 18), ), ], ), ), Spacer(), /// Alarm IconButton( onPressed: () {}, icon: Badge( backgroundColor: starbucksPrimaryColor, smallSize: 12, child: Icon( Icons.notifications_outlined, size: 32, color: Colors.grey, ), ), ) ], ), ), ), ), ], ), ); } }
-
미해결[코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!
GestureDetector 부분 onTap 함수 VoidCallBack 함수로 감싸는 이유?
아래의 코드중에 온탭 생성자 부분에서 바로 onTap(e)를 사용하지 않고 보이드콜백 함수로 감싸줘야하는 이유가child: GestureDetector( onTap: () { ontap(e); },해당 부분에서 onTap 메소드? 함수가 받는 형식은제스처콜백 타입으로 typedef GestureTapCallback = void Function(); 이지만 저희가 생성한 새로운 자료형은 void Function(String selectedColorName);형태이기때문에 완전한 형식을 지켜주는 (){} 형태가 최 상단에 위치하고 그 아래에 저희가 사용하고자 하는 형태로 만들어진 함수를 다시 불러와줌으로서 논리적으로 작동하게 만들어주는게 맞나요?생성한 onTap함수만 넣어서 에러를 읽어봤는데 제대로 이해가 안되서 질문 남깁니다.