묻고 답해요
141만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결[2024 최신] [코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!
웹뷰 띄우기에서 실행해도 빈화면만 나와요
안녕하세요.현재 웹뷰띄우기를 듣는중인데웹뷰 페키지 설치부터 다 똑같이 따라하는 중입니다.빌드는 잘 되는데 시뮬레이터에는 빈화면만 뜨네요..홈 아이콘까지 추가는 했는데 웹뷰는 여전히 안떠요..혹시 몰라 다른 url로도 해봤는데 여전히 안뜨네요
-
해결됨Flutter 앱 개발 기초
에뮬레이터 무한로딩
안녕하세요 강사님! 첫번째 부팅을 시작하고 있는데요!이것만 vscode 터미널창에 계속나타나고에뮬레이터는 무한로딩되는데첫번쨰 부팅이라 시간이 오래걸리는 건가요?몇시간 기다려봐야 하나요?
-
해결됨[코드팩토리] [중급] Flutter 진짜 실전! 상태관리, 캐시관리, Code Generation, GoRouter, 인증로직 등 중수가 되기 위한 필수 스킬들!
Http Status Error [401]에 관하여 - go_router : ^7.0.1 사용
go_router 7.0.1 버전을 사용하여 강의를 진행 중에 있습니다.RefreshToken과 AccessToken은 Storage에서 지워진 상태입니다.해당 상태에서 두개의 토큰이 null로 확인되면 dio.dart에서 dioError를 호출하고 reject하는 부분까지는 확인을 했습니다. 그런데 여기서 SplashScreen으로 이동을 하지 않고 Home화면에서 데이터를 가져오지못했다는 메시지만 띄웁니다.로그 화면에도 보면 프로그램 실행 시 /restaurant을 호출하게 되는데 제가 코드에서 처리를 잘 못한건지 잘 모르겠습니다.제가 생각하기에는 /restaurant가 호출되기 전에 /user/me가 먼저 호출 되어, 토큰 값을 체크하고 그 다음에 토큰 값의 유무에 따라 화면이 전환이 되어야 된다고 생각이 드는데 제가 잘못 이해하고 있는가요? 코드는 git에 올려두었습니다.https://github.com/bluelf1004/study.git
-
해결됨[코드팩토리] [중급] Flutter 진짜 실전! 상태관리, 캐시관리, Code Generation, GoRouter, 인증로직 등 중수가 되기 위한 필수 스킬들!
Provider 와 StateProvider의 사용에 관해.
강의 잘 듣고 있습니다. 한 가지 의문이 있어 글 올립니다. 강의 내용 중 provider.dart에서 final filterShoppingListProvider = Provider<List<ShoppingListItem>>((ref) { } 부분에서 final filterShoppingListProvider = StateProvider<List<ShoppingListItem>>((ref) { } 로 사용하면 어떻게 다를까요? Provider 안에 속한 Provider를 인지하기 위해 꼭 Provider를 사용한다는 걸까요?... 1회성은 StateProvider를 쓴다는 식으로 이해하면 되겠습니까?
-
해결됨[코드팩토리] [중급] Flutter 진짜 실전! 상태관리, 캐시관리, Code Generation, GoRouter, 인증로직 등 중수가 되기 위한 필수 스킬들!
너무 어렵습니다 ㅜㅜ
작업기억이란게 한계가 있는데oop를 통한 상속의 상속의 인터페이스 물리고 물리고 물리고 물리는 제네릭타입 등단편적으로 보면 이해할수없고 모든 그림을 이해하고있어야 그나마 따라갈수 있는부분이라고 생각됩니다.그런데 20시간의 긴 강의이다보니 전체 배경을 모두 기억할수가 없는데요.클래스 이름도 너무 길고 비슷하게 레스토랑레파지토리프로바이더 이런식으로 되서 가독성이 너무 떨어져서 초보자 입장에서는 이해하기가 더욱힘듭니다.. 제생각에는 강의를 시작하기전에 해당 챕터의 핵심 플로우를 먼저 집고 넘어가고 너무 길거나 비슷한 클래스 이름들은 유니크하게 했으면 어떨까하는 아쉬움이 남습니다. 제가 멍청한건지 모르겠지만.. 코팩님 강의가 너무 유익해서 다음강의도 볼 의향이 있는데 혹시 다음강의를 찍게되신다면 저같은 사람도 배려해주셨으면 해서 이렇게 글 남겨드립니다.. 아 그리구 깃허브에서 rest 레파지토리를 클론해서 실행해보니 페이지네이션한 코드가 잘못된건지 서버에 애초에 데이터가 부족한건지 중복데이터를 가져오는것이 많은데요 페이지네이션은 문제 없는것 맞나요 ??
-
미해결[2024 최신] [코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!
안드로이드스튜디오에서 Xcode를 꼭 거쳐서 실행해야 하나요?
한동안 바빠서... 간만에 플러터 공부하러 다시 왔습니다.그런데... 안드로이드 스튜디오에서 Run을 시키니까 Xcode가 뜨면서 앱이 Xcode에서 실행이 되네요.(실제기기)콘솔창 메시지 보니까 이상한 건 아닌데... 반드시 이런 건 아닌 것 같기도 하고(You may be prompted to...) 혹시 xcode 바이패스 하고 안드로이드 스튜디오에서 직접 실행시키는 방법이 있을까요?알려주시면 감사하겠습니다.
-
미해결[2024 최신] [코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!
동영상 플레이어 강의 중 동영상 재생 시 초록창이 뜹니다.
동영상 플레이어 강의 진행 중입니다.ImagePicker 사용해보기를 진행하고 실행하였는데위와 같이 초록 창이 뜹니다. 코드는 에러 없이 실행되나 D/CCodecBuffers( 6275): int32_t channel-mask = 12D/CCodecBuffers( 6275): int32_t max-output-channel-count = 8D/CCodecBuffers( 6275): string mime = "audio/raw"D/CCodecBuffers( 6275): int32_t sample-rate = 48000D/CCodecBuffers( 6275): int32_t android._config-pcm-encoding = 2D/CCodecBuffers( 6275): } 위와 같은 메시지가 길게 콘솔에 출력됩니다. 강의를 더 진행하여 플레이 버튼을 만들고 영상을 플레이 하니 영상은 정상 출력됩니다. 미리보기 화면만 저렇게 출력되는 거 같아요. 호환성 문제로 생각되어지는데 해결 방법을 찾지 못해서 문의 드립니다. 사용하고 있는 에뮬레이터는 Pixel XL API TiramisuPrivacySandbox 입니다.
-
해결됨[Bloc 응용] 실전 앱 만들기 (책 리뷰 앱) : SNS 로그인, Firebase 적용, Bloc 상태 관리, GoRouter
즐겨찾기 기능 질문 요청드립니다..
페이지 처음진입시 즐겨찾기 클릭하면정상적으로 별이 on 으로 바뀌게 되는데" 한번끄고 다시 키면 on으로 바뀌지않고 off 형태의 아이콘이되어있고 다시 뒤로갔다가 들어오면 정상적으로 on 으로 바껴있습니다 !!= 파이어베이스 db 상에는 데이터가 들어오지만상태가 바뀌지않아서 off 상태일때 10번누르면10번이 다 firebase db에 insert 되는현상이 나타납니다 ㅠㅠprofilePageactions: [ GestureDetector( onTap: () { var myUid = context.read<AuthenticationCubit>().state.user!.uid; context.read<UserProfileCubit>().followToggleEvent(myUid!); }, child: Padding( padding: const EdgeInsets.only(right: 20), child: BlocBuilder<UserProfileCubit,UserProfileState>( builder: (context,state) { var myUid = context.read<AuthenticationCubit>().state.user!.uid; var isFollowing = state.userModel?.followers?.contains(myUid) ?? false; return SvgPicture.asset(isFollowing ? 'assets/svg/icons/icon_follow_on.svg' :'assets/svg/icons/icon_follow_off.svg'); } ), ),user profile cubit void followToggleEvent(String myUid) async { if (state.userModel!.followers != null && state.userModel!.followers!.contains(myUid)) { // 즐겨찾기 취소 언팔 var result = await userRepository.followEvent(false,state.userModel!.uid!,myUid); if (result) { await _unfollow(myUid); } } else { // 즐겨 찾기 하기 var result = await userRepository.followEvent(true,state.userModel!.uid!, myUid); if (result) { await _follow(myUid); } } } _unfollow(myUid) async { emit( await state.copyWith( userModel: state.userModel!.copyWith( followers: List.unmodifiable( [...state.userModel!.followers!.where((targetUid) => targetUid != myUid)], ), ), ), ); } _follow(myUid) async { print(state.userModel!.followers); if (state.userModel!.followers == null) { // 최초 팔로워 대상 emit( await state.copyWith( userModel: state.userModel!.copyWith( followers: List.unmodifiable( [myUid], ), ), ), ); } else { // 다른사람이 이미 팔로워 한사람 emit( await state.copyWith( userModel: state.userModel!.copyWith( followers: List.unmodifiable( [ ...state.userModel!.followers!, uid ], ), ), ), ); } } }user-repositoryFuture<bool> followEvent(bool isFollow,String targetUid, String myUid) async { try { // 2 가지 업데이트 ( 트랜잭션 실행 필요 ) final batch = db.batch(); // Type1 . 상대방 팔로워에 내가 들어가는건다.. var targetUserDoc = await db.collection("users").where("uid", isEqualTo: targetUid).get(); UserModel targetUserInfo = UserModel.fromJson(targetUserDoc.docs.first.data()); var followers = targetUserInfo.followers ?? []; // 최초사람 if (isFollow) { followers.add(myUid); } else { followers.remove(myUid); } var targetRef = db.collection("users").doc(targetUserDoc.docs.first.id); batch.update(targetRef, {'followers': followers}); // Type1 . 내 팔로워에 상대방이 들어간다... var myUserDoc = await db.collection("users").where("uid", isEqualTo: myUid).get(); UserModel myUserInfo = UserModel.fromJson(myUserDoc.docs.first.data()); var followings = myUserInfo.followings ?? []; if (isFollow) { followings.add(targetUid); } else { followings.remove(targetUid); } var MyRef = db.collection("users").doc(myUserDoc.docs.first.id); batch.update(MyRef, {'followings': followings}); await batch.commit(); return true; } catch (e) { return false; } }
-
해결됨[Bloc 응용] 실전 앱 만들기 (책 리뷰 앱) : SNS 로그인, Firebase 적용, Bloc 상태 관리, GoRouter
리뷰작성 별점 문의
안녕하세요 개남님!! 다름이아니라 리뷰작성페이지에서 별점을 올려놓고 리뷰 입력할려고 텍스트 필드를 클릭하고 나면 별점이 0.00 으로 다시 되돌아가고 있습니다. 그리고 save 저장할대 값은 5.44 대로 잘 들어오고 있는 현상이 나타납니다 ㅠ..ㅠ리뷰 슬라이드바는 공유 해주신 dart 파일 그대로 사용하였구용 import 'package:book1/src/common/components/app_divider.dart'; import 'package:book1/src/common/components/review_slider_bar.dart'; import 'package:book1/src/common/model/naver_book_info.dart'; import 'package:book1/src/review/cubit/review_cubit.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_svg/svg.dart'; import 'package:go_router/go_router.dart'; import '../../common/components/app_font.dart'; import '../../common/components/btn.dart'; class ReviewPage extends StatelessWidget { NaverBookInfo naverBookInfo; ReviewPage(this.naverBookInfo, {super.key}); @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( leading: GestureDetector( onTap: context.pop, child: Padding( padding: const EdgeInsets.all(15.0), child: SvgPicture.asset('assets/svg/icons/icon_arrow_back.svg'), ), ), title: AppFont( "리뷰 작성", size: 18, ), centerTitle: true, ), body: Column( children: [ _HeaderBookInfo(naverBookInfo), AppDivider(), Expanded(child: _ReviewBox()), ], ), bottomNavigationBar: Padding( padding: EdgeInsets.only( left: 20, right: 20, top: 20, bottom: 20 + MediaQuery.of(context).padding.bottom), child: Btn( onTap: context.read<ReviewCubit>().save, text: '저장', ), ), ); } } class _ReviewBox extends StatelessWidget { _ReviewBox({super.key}); @override Widget build(BuildContext context) { return TextField( // 전체화면 텍스트필드 maxLines: null, decoration: const InputDecoration( border: InputBorder.none, hintText: "리뷰를 입력해주세요", contentPadding: EdgeInsets.symmetric(horizontal: 25), hintStyle: TextStyle( color: Color(0xff585858), ), ), onChanged: context.read<ReviewCubit>().changeReview, style: TextStyle(color: Colors.white), ); } } class _HeaderBookInfo extends StatelessWidget { final NaverBookInfo naverBookInfo; _HeaderBookInfo(this.naverBookInfo, {super.key}); @override Widget build(BuildContext context) { return Padding( padding: const EdgeInsets.all(25.0), child: Row( children: [ ClipRRect( borderRadius: BorderRadius.circular(7), child: SizedBox( width: 71, height: 106, child: Image.network( naverBookInfo.image ?? '', fit: BoxFit.fill, )), ), SizedBox( width: 15, ), Expanded( //어디 영역까지 사용할거냐 child: Column( crossAxisAlignment: CrossAxisAlignment.stretch, children: [ AppFont( naverBookInfo.title ?? '', size: 16, fontWeight: FontWeight.bold, ), SizedBox( height: 5, ), AppFont( naverBookInfo.author ?? '', size: 12, color: Color(0xff878787), ), SizedBox( height: 10, ), ReviewSliderBar( onChange: context.read<ReviewCubit>().changeValue, ), ], ), ) ], ), ); } }
-
미해결[2024 최신] [코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!
안드로이드 에뮬레이터 Location에 지도가 안떠요
안드로이드 스튜디오에서 위치설정을 해주고 싶은데 기기를 변경해도 api 버전을 바꿔도 안스 지웠다 다시 깔아도 Location에 지도 영역이 계속 흰색화면으로만 뜹니다. 왜 이러는건지 모르겠어요 ㅠㅠ 안드로이드 스튜디오에서 에뮬레이터 돌리고 있고 에뮬레이터 버전은 Pixel4에 API 버전 30입니다
-
해결됨[코드팩토리] [중급] Flutter 진짜 실전! 상태관리, 캐시관리, Code Generation, GoRouter, 인증로직 등 중수가 되기 위한 필수 스킬들!
FlutterSecureStorage를 사용하는 이유가 무엇인가요?
shared_preferences보다는 FlutterSecureStorage를 사용하는 것이 안전하다는 글을 많이 찾게 되었습니다.그런데 Hive를 사용하지 않는 이유도 같은가요?저장하는 데이터 형태가 key: value 형태로 nosql 형태인데 hive도 가능할 것 같아서 질문드립니다.
-
미해결[코드팩토리] [중급] Flutter 진짜 실전! 상태관리, 캐시관리, Code Generation, GoRouter, 인증로직 등 중수가 되기 위한 필수 스킬들!
RefreshIndicator 관련 질문
안녕하세요, 코드팩토리님 강의 기반으로 RefreshIndicator를 구현하였는데, fetchMore가 true로 가고, forceRefetch가 false로 가서 제대로 새로고침이 동작하지 않는 문제가 있습니다.디버그모드로 돌려보니 refresh_indicator.dart를 통할 때 fetchMore와 forceRefetch 값을 바꿔버리던데.. 이거는 플러터에 있는 자체 코드라 수정이 어려운 것 같아요.코드 캡쳐는 아래를 참고 부탁드립니다.[pagination_list_view.dart][pagination_provider.dart]참고로 dart 버전은 2.19.6이고, flutter 버전은 3.7.12입니다.
-
해결됨[코드팩토리] [중급] Flutter 진짜 실전! 상태관리, 캐시관리, Code Generation, GoRouter, 인증로직 등 중수가 되기 위한 필수 스킬들!
postman 질문
현재 postman에서 다른 탭들은 정상적으로 값이 나오는데,GET/restaurant만 401에러가 지속적으로 뜹니다. 왜그런걸까요?이건 바로 다음 탭(/{rid})의 화면입니다.
-
해결됨[2024 최신] [코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!
미세먼지 데이터를 불러오는 과정에서 이슈가 있어 질문 드립니다.
안녕하세요.stat_repository.dart 파일 내부에서 API를 불러오는 과정에 이슈가 있어 질문 드립니다. import 'package:dio/dio.dart'; import 'package:dusty_dust/const/data.dart'; import 'package:dusty_dust/model/stat_model.dart'; class StatRepository { static Future<List<StatModel>> fetchData() async { // final response = await Dio().get( // 'http://apis.data.go.kr/B552584/ArpltnStatsSvc/getCtprvnMesureLIst', // queryParameters: { // 'serviceKey': serviceKey, // 'returnType': 'json', // 'numOfRows': 30, // 'pageNo': 1, // 'itemCode': 'PM10', // 'dataGubun': 'HOUR', // 'searchCondition': 'WEEK', // }, // ); final response = await Dio().get( 'http://apis.data.go.kr/B552584/ArpltnStatsSvc/getCtprvnMesureLIst' '?serviceKey=$serviceKey' '&returnType=json' '&numOfRows=30' '&pageNo=1' '&itemCode=PM10' '&dataGubun=HOUR' '&searchCondition=WEEK', ); return response.data['response']['body']['items'] .map<StatModel>( (item) => StatModel.fromJson(json: item), ) .toList(); } } 위 코드에서 주석을 처리한 부분대로 API를 호출하면(기존 강의 내용) 다음과 같은 에러가(서비스키가 등록되지 않았다는 내용) 나오고<OpenAPI_ServiceResponse> <cmmMsgHeader> <errMsg>SERVICE ERROR</errMsg> <returnAuthMsg>SERVICE_KEY_IS_NOT_REGISTERED_ERROR</returnAuthMsg> <returnReasonCode>30</returnReasonCode> </cmmMsgHeader> </OpenAPI_ServiceResponse> 위 코드에서 엔드포인트 부분에 직접 파라미터를 적으면 정상적으로 데이터가 출력됩니다. 관련 이슈들을 구글링 해보니 serviceKey를 받아오는 과정에서 인코딩 과정이 별도로 필요하다는데 만약 내부 설정을 변경 한다면 어떻게 해야 할까요?
-
해결됨[2024 최신] [코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!
비디오 플레이어에서 onSliderChange에 대해 질문있습니다~
안녕하세요.비디오 플레이어 강의를 모두 듣고 소스를 복습하고 있습니다.복습을 하면서 한가지 아리송한게 있어서 질문드립니다. 여기 onSliderChange의 val은 _Bottom으로 따로 빼서 구현한 함수에서 value인 currentPosition.inSeconds.toDouble()를 받는건가요? print로 찍어가며 확인한 결과 맞는거 같긴한데 아리송해서 질문드립니다~ void onSliderChange(double val) { videoController!.seekTo( Duration( seconds: val.toInt(), ), ); }Expanded( child: Slider( value: currentPosition.inSeconds.toDouble(), onChanged: onSliderChange, max: maxPosition.inSeconds.toDouble(), min: 0, ), ),
-
해결됨[2024 최신] [코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!
typedef를 사용하는이유?
이전 강의까지는 상위 class에 method를 생성해서 onTap() 함수를 넘겨줬는데 이번엔 전역으로 typedef로 선언한 이유가 있을까요? typedef ColorIdSetter = void Function(int id); class _ColorPicker extends StatelessWidget { const _ColorPicker({ super.key, required this.colors, required this.selectedColorId, required this.colorIdSetter, }); final List<CategoryColor> colors; final int selectedColorId; final ColorIdSetter colorIdSetter; @override Widget build(BuildContext context) { return Wrap( runSpacing: 10, spacing: 8, children: colors .map( (e) => GestureDetector( onTap: () { colorIdSetter(e.id); }, child: renderColor(e, selectedColorId == e.id), ), ) .toList(), ); }
-
미해결[2024 최신] [코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!
설치했으나 인지를 못하는듯합니다
-안드로이드 스튜디오 설치 했으나 not installcocoapads 또한 영상대로 진행했고 java는 자체적으로 설치한건 없으나 안드로이드 스튜디오에 내장된걸로 알고있습니다 개인적으로 안드로이드 스튜디오가 설치가 안되있는걸로 나오니 java도 인지를 못하는가 싶기도하고 xcode 시뮬레이터는 안켜지네요 ㅜ 삽질을 계속 하고있는거같아 사진찍어 문의드립니다 사진상 보시면 뒤에 어두운 계열로 켜져있는데 그게 안드로이드 스튜디오로 이미 설치가 되어있습니다 해결책좀 부탁드림다 ㅜ
-
해결됨[코드팩토리] [중급] Flutter 진짜 실전! 상태관리, 캐시관리, Code Generation, GoRouter, 인증로직 등 중수가 되기 위한 필수 스킬들!
PatchMeBasketDto 서버 에러 급합니다.
안녕하세요. 섹션 16 -> Postman API 테스트 부분을 듣고 있는 수강생입니다.하나씩 강의 영상대로 따라하면서 공부하고있습니다.로그인 요청을 보내서 로그인 토큰을 받고GET /restaurant 으로 레스토랑 리스트 받아오고받아온 레스토랑 id를 기반으로 restaurant/:rid 에 rid 키로 상세 페이지를 요청하였습니다.그 후 user/me/basket의 productId 상세페이지에서 나온 id를 입력했는데 서버에서 아래와 같은 오류가 나옵니다. 강사님의 빠른 답변 기다리겠습니다. 좋은 강의 감사합니다. ==== 포스트맨 에러{ "statusCode": 500, "message": "Internal server error" } ==== NextJS 에러 {}PatchMeBasketDto {}[Nest] 6648 - 2023. 11. 21. 오후 4:21:06 ERROR [ExceptionsHandler] Cannot read properties of undefined (reading 'map')TypeError: Cannot read properties of undefined (reading 'map') at UserService._mapBasketDtoToProduct (D:\FlutterProject\restapi\src\user\user.service.ts:74:21) at UserService.addToBasket (D:\FlutterProject\restapi\src\user\user.service.ts:66:24) at UserController.patchMeBasket (D:\FlutterProject\restapi\src\user\user.controller.ts:87:29) at D:\FlutterProject\restapi\node_modules\@nestjs\core\router\router-execution-context.js:38:29 ==== 단계별 스크린샷1. 레스토랑 리스트 요청2. 상세 레스토랑 정보 요청3. PATCH 장바구니 요청4. 서버 에러
-
미해결[코드팩토리] [중급] Flutter 진짜 실전! 상태관리, 캐시관리, Code Generation, GoRouter, 인증로직 등 중수가 되기 위한 필수 스킬들!
안녕하세요 제너릭 관련하여 질문이 있습니다.
안녕하세요. 해당 강의에 질문이 있어서 글을 남깁니다. 강의에 소개된대로 itemBuilder에 RestaurantModel 제너릭을 제공해준 경우 return PaginationListView( provider: restaurantProvider, itemBuilder: <RestaurantModel>(context, index, model) { return GestureDetector( onTap: () { Navigator.of(context).push(MaterialPageRoute( builder: (_) => RestaurantDetailScreen( id: model.id, ), )); }, child: RestaurantCard.fromModel(model: model), ); }, ); PaginationListView에 제너릭을 제공한 경우 return PaginationListView<RestaurantModel>( provider: restaurantProvider, itemBuilder: (context, index, model) { return GestureDetector( onTap: () { Navigator.of(context).push(MaterialPageRoute( builder: (_) => RestaurantDetailScreen( id: model.id, ), )); }, child: RestaurantCard.fromModel(model: model), ); }, );위 두가지 경우 중에 PaginationListView 소스를 확인하면 2번 항목이 맞는거 같은데 작동은 1번에서만 가능합니다. typedef PaginaitonWidgetBuilder<T extends IModelWithId> = Widget Function( BuildContext context, int index, T model, ); class PaginationListView<T extends IModelWithId> extends ConsumerStatefulWidget { final StateNotifierProvider<PaginationProvider, CursorPaginationBase> provider; final PaginaitonWidgetBuilder<T> itemBuilder; const PaginationListView({ super.key, required this.provider, required this.itemBuilder, }); @override ConsumerState<PaginationListView> createState() => _PaginationListViewState<T>(); }제가 생각한 해석방식은 이렇습니다.PaginationListView 생성 시 ImodelWithId를 extend 한T 타입을 제너릭으로 받습니다.따라서 itemBuilder가 아닌 PaginationListView<RestaurantModel>과 같이 제너릭을 제공한 경우, 해당 타입을 PaginationWidgetBuilder에 매핑 됩니다. 위 해석방식에서 제가 틀리게 생각한게 있나요? 에러메시지는 아래와 같습니다. The following _TypeError was thrown building: type '(BuildContext, int, RestaurantModel) => GestureDetector' is not a subtype of type '(BuildContext, int, IModelWithId) => Widget'
-
미해결[코드팩토리] [중급] Flutter 진짜 실전! 상태관리, 캐시관리, Code Generation, GoRouter, 인증로직 등 중수가 되기 위한 필수 스킬들!
결제오류 입니다.
코드는 전혀 문제가 없는 것 같은데, 결제창으로 넘어가지를 않습니다.코드를 보면 만약 resp 일때 OrderDoneScreen으로 넘어가도록 되어있는데, 그 resp 는 await ref.read(orderProvider.notifier).postOrder(); 이라고 했습니다.그렇다면 이 resp가 이 상태가 아니라는 건데, 이걸 어떻게 확인을 하면 좋을까요?에러의 이유로는 'type 'Null' is not a subtype of type 'String' in type cast' 라고 나옵니다.저번에는 재설치 하면 넘어갔었는데, 이번에는 아무리 모든 코드를 검사해봐도 이유를 모르겠습니다 ㅠSizedBox( width: double.infinity, child: ElevatedButton( onPressed: () async { final resp = await ref.read(orderProvider.notifier).postOrder(); if (resp) { context.goNamed(OrderDoneScreen.routeName); } else { ScaffoldMessenger.of(context).showSnackBar( SnackBar( content: Text( '결제 실패!', ), ), ); }