inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

묻고 답해요

172만명의 커뮤니티!! 함께 토론해봐요.

캘린더 스케쥴러 Today Banner설계 질문있습니다

미해결

[코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!

안녕하세요. 플러터 강의 잘 보고 있습니다. Today Banner설계 강의 마지막부분에 home_screen으로 onDaySelected함수를 뺐는데 home_screen에서 이 함수를 정의를 하고 ~ chileren[ Calendar( selectedDay: selectedDay, focusedDay: focusedDay, onDaySelected : onDaySelected, ), ~ 위처럼 Calendar안에 onDaySelected를 파라미터로 넣었는데요, 이 함수가 실행되는 시점은 calendar.dart파일 안에서 TableCalendar를 리턴할때, onDaySelected : onDaySelected 이 부분에 의해 실행이 되는데 제가 이해하고 있는거로는 home_screen.dart가 stateful위젯이니까 그 안에 Calendar( selectedDay: selectedDay, focusedDay: focusedDay, onDaySelected : onDaySelected, ), 가 실행 되면 home_screen.dart안에 build함수가 다시 불려서 그림을 다시 그리는거로 이해하고 있습니다.(캘린더 날짜를 클릭하는대로 날짜가 바뀌는) 근데 home_screen에서 onDaySelected함수를 정의해서 Calendar() 안에 넣는데 어떻게 _HomeScreenState에 정의한 selectedDay의 값을 받아와서 그 밑에 TodayBanner안에 selectedDay매개변수에 넣어줄 수 있는지 이해가 안됩니다. 요약하자면 home_screen에 onDaySelected를 정의했고 Calendar()에 정의한 onDaySelected를 넣어서 Calendar내부에서 실행을 한건데 그럼 onDaySelected함수에 정의한 this.selectedDay = selectedDay; 이 부분은 calendar.dart에 있는 selectedDay에 들어가야하는거 아닌지, 어떻게 home_screen의 selectedDay에 값이 들어가게 되는지 알고싶습니다. 답변 부탁드리겠습니다.

  • flutter
  • 클론코딩
khs50851 댓글 1 좋아요 0 조회수 355

IIS 500.19에러

미해결

남박사의 파이썬으로 실전 웹사이트 만들기

구글로 먼저 배포 해보고 잘 되서 IIS로 배포해보려고 하는데 다음과 같이 나옵니다 handler도 Allow로 바꿨고 web.config는 그대로 복사하고 경로도 확인했는데 뭐가 문제일까요...ㅠㅜㅠ

  • python
Eddie 댓글 2 좋아요 0 조회수 675

Bucket Provider 대신에 Riverpod 로 변경해보고 싶어요.

해결됨

Flutter 앱 개발 기초

안녕하세요. 3강 강의를 듣고 질문드립니다. 상태관리는 Riverpod 로 변경해보고 싶은데 잘 안됩니다. /// 버킷 클래스 class Bucket { String job; // 할 일 bool isDone; // 완료 여부 Bucket(this.job, this.isDone); // 생성자 } Provider 의 BucketService class BucketService extends ChangeNotifier { List<Bucket> bucketList = [ //Bucket('잠자기', false), // 더미데이터 ]; /// bucket 추가 void createBucket(String job){ bucketList.add(Bucket(job, false)); notifyListeners(); } /// bucket 수정 void updateBucket(Bucket bucket, int index){ bucketList[index] = bucket; notifyListeners(); } /// bucket 삭제 void deleteBucket(int index){ bucketList.removeAt(index); notifyListeners(); } } 이걸 Riverpod v2 기준으로 변경해보고 싶은데 매개변수를 그대로 사용하면서 할 수 있는 방법을 모르겠습니다. final bucketProvider = NotifierProvider<BucketNotifier, List<Bucket>>(BucketNotifier.new); class BucketNotifier extends Notifier<List<Bucket>> { @override List<Bucket> build() => []; /// bucket 추가 void createBucket(String job){ state = [...state, Bucket(job, false)]; } /// bucket 수정 void updateBucket(Bucket bucket, int index){ } /// bucket 삭제 void deleteBucket(int index){ //state = state.where((element) => element != index).toList(); // element 에는 index 가 없는데 어떻게 비교할 수 있을까? } }

  • flutter
Link 댓글 1 좋아요 1 조회수 238

firebase 관련오류

해결됨

Flutter로 SNS 앱 만들기

안녕하세요.. 사용자 인증 시 아래와 같은 예외가 발생합니다. FirebaseAuthException ([firebase_auth/too-many-requests] We have blocked all requests from this device due to unusual activity. Try again later.) 여기저기 찾아봐도 이유를 모르겠습니다 혹시, 이유를 아시면 답변 부탁드리겠습니다. 감사합니다.

  • flutter
  • android
  • firebase
  • dart
이주한 댓글 1 좋아요 0 조회수 671

StreamBuilder 관련 질문입니다.

미해결

[코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!

강의 중에 snapshot.data 를 콘솔에 찍는 부분에 관한건데요! hot reload시 케바케로 - flutter: null flutter: Latitude: 37.522327, Longitude: 126.921252 flutter: Latitude: 37.522327, Longitude: 126.921252 - 와 같이 현재 포지션이 두번 찍힐때가 있는데 이런건 어떤거때문인걸까요? 제가 생각하기로는 앱 로딩 시 빌드 함수가 실행되면서 getPositionStream()이 실행되나, 위치 잡아오기 전이라 null 반환 이후 위치 잡아오면 스트림에 입력되어 위/경도값 반환 이게 끝인거같은데 종종 보면 저 위/경도값이 두번 찍힐때가 있더라구요..! 이유가 궁금합니다.

  • flutter
  • 클론코딩
DJB 댓글 1 좋아요 0 조회수 225

구글맵 Using the Impeller rendering backend. 에러 뜨시는 분들!

미해결

[코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!

Impeller라는 렌더링 백엔드가 현 앱과 호환되지 않는 경우에 발생할 수 있는 문제라고 합니다. info.plist에 <key>FLTEnableImpeller</key> <false/> 추가해주시면 해결됩니다~

  • flutter
  • 클론코딩
DJB 댓글 1 좋아요 0 조회수 1085

NotifierProvider 로 변경하고 싶어요

해결됨

Flutter 앱 개발 실전

안녕하세요. Riverpod 상태관리에서 StateNotiferProvider 대신에 NotifierProvider를 사용하는 것을 권장하신다고 하셨는데요. StateNotifierProvider 로 작성한 코드를 NotiferProvider 로 변경하고 싶은데 잘 안되어 문의 드립니다. contactStateProvier 코드로는 정상 동작됩니다. 이 코드를 NotifierProvider 로 변경해보려고 하는데 잘 안되네요. final contactStateProvider = StateNotifierProvider<ContactStateNotifier, ContactResultBase>( (ref) { final repository = ref.watch(restClientProvider); final notifier = ContactStateNotifier(restClient: repository); return notifier; }, ); class ContactStateNotifier extends StateNotifier<ContactResultBase> { final RestClient restClient; ContactStateNotifier({required this.restClient}) : super(ContactResultLoading()) { postContactList(); } postContactList() async { final resp = await restClient.postContactList( Crypto.AES_encrypt(Crypto.URLkey()), ''); state = resp; } } @RestApi(baseUrl: RetrofitURL.baseUrl) abstract class RestClient { factory RestClient(Dio dio, {String baseUrl}) = _RestClient; @POST(RetrofitURL.mLogin) @FormUrlEncoded() Future<LoginResponse> userLogin( @Field() String keyword, @Field() String userID, @Field() String password, @Field() String uID, @Field() String mfoneNO, ); @POST(RetrofitURL.contactData) @FormUrlEncoded() Future<ContactResult> postContactList( @Field() String keyword, @Field() String search, ); } final secureStorageProvider = Provider<FlutterSecureStorage>((ref) => const FlutterSecureStorage()); final dioProvider = Provider<Dio>((ref) { final dio = Dio(); final storage = ref.watch(secureStorageProvider); dio.interceptors.add(LogInterceptor()); dio.interceptors.add( CustLogInterceptor(storage: storage,), ); return dio; }); final restClientProvider = Provider<RestClient>((ref) { final dio = ref.watch(dioProvider); final repository = RestClient(dio); return repository; }); contactStateProvider 를 변경시도 해보다가 에러가 발생한 코드 final contactProvider = NotifierProvider<ContactNotifier, ContactResultBase>( () { final repository = ref.watch(restClientProvider); final notifier = ContactNotifier(restClient: repository); return notifier; }, ); class ContactNotifier extends Notifier<ContactResultBase> { @override ContactResultBase build() => ContactResultLoading(); final RestClient restClient; ContactStateNotifier({required this.restClient}) { postContactList(); } postContactList() async { final resp = await restClient.postContactList( Crypto.AES_encrypt(Crypto.URLkey()), ''); state = resp; } }

  • flutter
Link 댓글 1 좋아요 0 조회수 386

맥북에서 에뮬, 시뮬레이터 오류들

미해결

[코드팩토리] [중급] Flutter 진짜 실전! 상태관리, 캐시관리, Code Generation, GoRouter, 인증로직 등 중수가 되기 위한 필수 스킬들!

안녕하세요, 수업 잘 듣고 있습니다. 다름이 아니라 이번에는 제가 근무지 이동때문에 데스크탑(윈도우)이 아닌 맥북(m1)으로 코딩을 공부하는 중입니다. 현재 가장 최신인 giraffe버전인데, 맥북에서 시뮬레이터로 코딩하면 크롬에서 스웨거도 잘 뜨고, 자동로그인도 잘되어 splashscreen페이지에서 바로 rootTab으로 넘어갑니다. 그런데 그 외의 서버에서 보내오는 이미지나 텍스트 데이터들이 전혀 뜨지 않아 무한 로딩을 합니다ㅠ 그래서 에뮬레이터를 돌려보려고 하니 파일 경로중에 알맞지 않은 문자가 있다는데, 아무리 봐도 '_'(아래바) 제외하고는 전혀 특수문자나 공백은 없습니다.. 에뮬도 안켜지고, 시뮬레이션에 데이터도 안떠서 답답하네요; 도움 구할 곳이 없어 도움 구해봅니다 ㅠ 올 한해도 고생 많으셨고, 해피 크리스마스 입니다^^

  • flutter
  • 하이브리드-앱
김지현 댓글 2 좋아요 0 조회수 549

GoRouter Redirection관련 질문이 있습니다..

미해결

[코드팩토리] [중급] Flutter 진짜 실전! 상태관리, 캐시관리, Code Generation, GoRouter, 인증로직 등 중수가 되기 위한 필수 스킬들!

안녕하세요? 강사님, 중급강의 섹션 13. [Go Router v7] GoRouter 이론 중 "Redirection" 파트에 관련된 질문인데요. 9_login_screen.dart 파일(LoginScreen 클래스)에 코딩된 "authState"는 router.dart파일에 코딩된 "authState"와 어떤 관계(?)인지를 모르겠습니다. 무슨말인가 하면 authState 변수는 LoginScreen 클래스내에서 별도로 선언을 해주지도 않았는데도 setStat를 이용해서 값을 ture, false로 바꿀 수 있는 것도 이상하고, 이렇게 LoginScreen 클래스에서 변경된 authState값이 router.dart파일에서 인식(?)이 되는것도 이상합니다. 제 질문이 조금 무식해 보이긴 한데... 제 질문 의도는 파악하셨으리라 생각되어서 답변 좀 부탁드리겠습니다...

  • flutter
  • 하이브리드-앱
임명훈 댓글 1 좋아요 1 조회수 268

강의자료 부탁 드립니다~

미해결

프로그래밍 시작하기 : 파이썬 입문 (Inflearn Original)

안녕하세요, 강의자료 부탁 드려도 될까요? fbyksong@gmail.com 입니다.

  • python
댓글 1 좋아요 0 조회수 265

오류 메세지

미해결

실전 프로젝트로 배우는 데이터 앱 만들기 with Python & Streamlit

안녕하세요~~ 루비네 코딩 입니다 ^^ 최근 앱을 런칭할 때 다음과 같은 오류가 발생하고 있습니다. ModuleNotFoundError: No module named 'altair.vegalite.v4' 이런경우, 다음과 같이 altair 패키지의 버전을 바꾸어 설치해 주세요 ^^ 감사합니다~ pip uninstall altair pip install altair==4.2.2

  • python
  • streamlit
루비네 코딩 댓글 2 좋아요 1 조회수 919

구글맵 지도 자체는 뜨는데 위치가 안뜨시는분들

미해결

[코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!

API 및 서비스 여기서 Maps SDK for Android랑 iOS 여기서 DISABLE로 되어있어야 활성화 된겁니다! 처음에 ENABLE로 되어야 활성화인줄알고 했다가 계속 안떴었네요! 강사님 이거 자막에 달아주시면 좋을거같습니다 ㅜㅜ

  • flutter
  • 클론코딩
khs50851 댓글 4 좋아요 2 조회수 658

GeneratedMocks로 생성한 코드의 위치를 변경하고싶어요

미해결

Flutter 테스트 기초

GeneratedMocks로 생성한 코드들이 많아지면 복잡할 것 같아서 생성되는 파일의 위치를 자동으로 변경해주고 싶은데요, 예를들면 현재 코드가 있는 디렉토리에 generated라는 디렉토리 안에다가 생성된 파일을 저장해주고싶어요. 어떠한 설정을 해야할까요?

  • flutter
  • 소프트웨어-테스트
  • ui-testing
  • integration-tests
김창호 댓글 1 좋아요 0 조회수 248

Didupdatewidget

미해결

[코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!

didupdatewidget과 setstate의 차이점을 알려주실 수 있나요? Setstate는 stateful위젯 안에서 변수를 변경하고 싶을때 사용하는건 알겠는데, didupdatewidget은 언재 사용하는지 잘 모르겠어요ㅜㅠ

  • flutter
  • 클론코딩
강원빈 댓글 1 좋아요 1 조회수 295

슬라이더를 누르고 있을때 재생안되는 방법

미해결

[코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!

재생 중에 슬라이더를 조절할려고하는데 슬라이더를 누른채로 동작을 안하면 영상이 자동으로 재생되어 버립니다 슬라이더에서 손을 뗄떼까지 영상이 멈추게 할수있을까요 인프런강의처럼요 또 한가지 질문은 videioController 는 initializeController()안에서 아래 코드로 할당이되는데 videoController = VideoPlayerController.file( File(widget.video.path), 이부분은 deadcode가 아닐까요 if (videoController == null) { return CircularProgressIndicator();

  • flutter
  • 클론코딩
당근농부 댓글 1 좋아요 0 조회수 262

[문의] ListView.builder 처리

해결됨

Flutter 앱 개발 실전

안녕하세요. 처음부터 List<ContactItem> 으로 데이터를 반환받아서 처리해야 하는 것인지, 아니면 아래 코드에서 분기처리할 방법이 있는지 궁금합니다. import 'package:json_annotation/json_annotation.dart'; import 'package:retrofit_ex2/model/contact_item.dart'; part 'contact_result.g.dart'; @JsonSerializable() class ContactResult { final String status; final String message; final List<ContactItem>? addrinfo; const ContactResult({ required this.status, required this.message, this.addrinfo, }); factory ContactResult.fromJson(Map<String, dynamic> json) => _$ContactResultFromJson(json); Map<String, dynamic> toJson() => _$ContactResultToJson(this); } import 'package:dio/dio.dart'; import 'package:retrofit/retrofit.dart'; import 'package:retrofit_ex2/common/repository/retrofit_url.dart'; import 'package:retrofit_ex2/model/contact_result.dart'; part 'rest_client.g.dart'; @RestApi(baseUrl: RetrofitURL.baseUrl) abstract class RestClient { factory RestClient(Dio dio, {String baseUrl}) = _RestClient; @GET(RetrofitURL.contactData) Future<ContactResult> getContactList(); } class ContactListPage extends StatefulWidget { const ContactListPage({Key? key}) : super(key: key); @override State<ContactListPage> createState() => _ContactListPageState(); } class _ContactListPageState extends State<ContactListPage> { late final RestClient restClient; @override void initState() { Dio dio = Dio(); restClient = RestClient(dio); super.initState(); } @override Widget build(BuildContext context) { return Scaffold( body: FutureBuilder<ContactResult>( future: restClient.getContactList(), builder: (BuildContext context, AsyncSnapshot<ContactResult> snapshot) { if (!snapshot.hasData) { return const Center( child: CircularProgressIndicator(), ); } final ids = snapshot.data as ContactResult; //print(ids.runtimeType); if (ids.status.contains("success")) { final addrinfo = ids.addrinfo as List<ContactItem>; print('addrinfo_count ::: ${addrinfo.length}'); // 15개 for(ContactItem item in addrinfo){ print('${item.idx} | ${item.userNM} | ${item.mobileNO} | ${item.photo}'); // 여기서 출력은 잘 됨. } return ListView.builder( itemCount: addrinfo.length, itemBuilder: (context, index) { // 총 15개의 List 데이터를 출력하기 위해서 어떻게 해야하는지요? return Text(''); }, ); } else { return const Center( child: Text('에러가 발생했습니다.'), ); } }, ), ); } Widget _contactListWidget(ContactItem item) { return Column( children: [ Text(item.idx.toString()), Text(item.userNM), Text(item.mobileNO), Text(item.telNO!), Text(item.photo!), ], ); } } 15개의 데이터를 GET으로 가져오는 것까지는 잘 되는 걸 확인했습니다. JSON 데이터 전체는 ContactResult 이고, addrinfo 는 List<ContactItem> 입니다. ContactItem 15개를 ListView.builder 를 이용하여 출력하려고 하는데 어떻게 해야 되는지 몰라 도움 요청드립니다.

  • flutter
Link 댓글 1 좋아요 1 조회수 287

에뮬레이터 관련 질문입니다

해결됨

Flutter 앱 개발 기초

처음엔 이 바가 보였는데 어느순간 부터 안보이더라구요. 있던게 안보이니 괜히 불안해서 다시 보이게 하는법을 알고싶습니다...;; 오픈 카카오톡 으로 문의주시면 더 빠르게 답변 받으실 수 있어요 :)

  • flutter
GOOSPEL 댓글 2 좋아요 1 조회수 320

CrossAxisAlignment.stretch 질문 있습니다.

미해결

[코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!

CrossAxisAlignment.stretch 는 교차축을 확장시키는 것으로 알고 있는데 이게 왜 가운대 정렬한 것처럼 작동하는지 모르겠습니다. 느낌 상으로는 CrossAxisAlignment.center 적용해야 할 것같은데 안되는 이유도 궁금합니다.

  • flutter
  • 클론코딩
송원 댓글 1 좋아요 0 조회수 198

basketProvider에서 patchBasket 함수 호출 시 에러가 발생합니다

미해결

[코드팩토리] [중급] Flutter 진짜 실전! 상태관리, 캐시관리, Code Generation, GoRouter, 인증로직 등 중수가 되기 위한 필수 스킬들!

제 코드는 아래와 같고, import 'package:advanced_app/product/model/product_model.dart'; import 'package:advanced_app/user/model/patch_basket_model.dart'; import 'package:advanced_app/user/model/basket_item_model.dart'; import 'package:advanced_app/user/repository/user_me_repository.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:collection/collection.dart'; final basketProvider = StateNotifierProvider<BasketProvider, List<BasketItemModel>>((ref) { final repository = ref.watch(userMeRepositoryProvider); return BasketProvider(repository: repository); }); class BasketProvider extends StateNotifier<List<BasketItemModel>>{ final UserMeRepository repository; BasketProvider({ required this.repository, }):super([]); Future<void> patchBasket () async { await repository.patchBasket( body: PatchBasketBody( basket: state.map( (e) => PatchBasketBodyBasket( productID: e.product.id, count: e.count)) .toList()) ); } Future<void> addToBasket({ required ProductModel product,}) async { // 1 아직 장바구니에 해당 상품이 없는 경우 -> 추가 // 2 동일한 상품이 있는 경우 -> count +1 final exists = state.firstWhereOrNull((e) => e.product.id == product.id) != null; if(exists){ state = state .map( (e) => e.product.id == product.id ? e.copyWith(count: e.count +1) : e ).toList(); }else{ state = [ ...state, BasketItemModel( product: product, count:1) ]; } await patchBasket(); } Future<void> removeFromBasket({ required ProductModel product, bool isDelete = false}) async{ // isDelete면 count와 상관없이 삭제 final exists = state.firstWhereOrNull((e) => e.product.id == product.id) != null; if(!exists){ return; } // 이제 무조건 있는 경우 final existingProduct = state.firstWhere((element) => element.product.id == product.id); // 1개 있는 경우 삭제 (해당하는 상품 빼고 리스트 만들어서 넣어 주는 방식) if (existingProduct.count == 1 || isDelete){ state = state .where((e) => e.product.id != product.id) .toList(); } else{ // 2개 이상 있는 경우 state = state .map((e) => e.product.id == product.id? e.copyWith( count: e.count -1) : e).toList(); } } } 에러 로그는 아래와 같습니다. -------------- [VERBOSE-2:dart_vm_initializer.cc(41)] Unhandled Exception: type 'Null' is not a subtype of type 'Map<String, dynamic>' in type cast #0 $BasketItemModelFromJson (package:advanced app/user/model/basket_item_model.g.dart:11:54) #1 new BasketItemModel.fromJson (package:advanced_app/user/model/basket_item_model.dart:25:14) #2 UserMeRepository.patchBasket.<anonymous closure> (package:advanced app/user/repository/user_me_repository.g.dart:93:45) #3 MappedListIterable.elementAt (dart:_internal/iterable.dart:415:31) #4 ListIterator.moveNext (dart:_internal/iterable.dart:344:26) #5 new GrowableList. ofEfficientLengthIterable (dart:core-patch/growable_array.dart:189:27) #6 new GrowableList.of (dart:core-patch/growable array.dart:150:28) #7 new List.of (dart:core-patch/array_patch.dart:47:28) #8 ListIterable.toList (dart:_internal/iterable.dart:214:7) #9 UserMeRepository.patchBasket (package:advanced app/user/repository/user_me_repository.g.dart:94:10) Postman에서 get http://127.0.0.1:3000/user/me/basket 실행해 보면, [ { "count": 1 } ] 처럼 product가 제대로 안들어가고 count 값만 들어가 있습니다. jsonSerializable 문제인가 싶어서 모델들 다 체크해봤는데... 코드 제너레이션도 정상적으로 되는데... 뭐가 문제일까요? 이것 때문에 3시간 넘게 씨름 중인데 도움 주시면 감사하겠습니다!

  • flutter
  • 하이브리드-앱
Hyunsang-Coder 댓글 3 좋아요 0 조회수 343

Unhandled Exception: type '_Map<String, dynamic>' is not a subtype of type 'Contact_Item'

해결됨

Flutter 앱 개발 실전

안녕하세요. 강의를 듣고나서 테스트를 해보는데 안되어서 문의 좀 드립니다. addrinfo: json['addrinfo'] == null ? null : List<Contact_Item>.from(json['addrinfo']), 위 부분을 어떻게 처리해야 해결될 수 있는지를 모르겠습니다. addrinfo 는 값이 서버에서 null을 반환할 수도 있고 List<Contact_Item> 을 반환할 수도 있습니다. class Contact_Item { final String idx; final String userNM; final String mobileNO; final String telNO; final String photo; final bool checkBoxState; const Contact_Item({ required this.idx, required this.userNM, required this.mobileNO, required this.telNO, required this.photo, required this.checkBoxState, }); factory Contact_Item.fromJson(Map<String, dynamic> json) { return Contact_Item( idx: json['idx'] as String, userNM: json['userNM'] as String, mobileNO: json['mobileNO'] as String, telNO: json['telNO'] as String, photo: json['photo'] as String, checkBoxState: json['checkBoxState'] as bool, ); } } class ContactResult { final String status; final String message; final List<Contact_Item>? addrinfo; const ContactResult({ required this.status, required this.message, this.addrinfo, }); factory ContactResult.fromJson(Map<String, dynamic> json) { return ContactResult( status: json['status'] ?? '', message: json['message'] ?? '', addrinfo: json['addrinfo'] == null ? null : List<Contact_Item>.from(json['addrinfo']), ); } } abstract class ContactRepo { Future<ContactResult> getAddressData(ContactRequest req); } class ContactService extends ContactRepo { Future<ContactResult> getAddressData(ContactRequest req) async { BaseOptions options = BaseOptions( baseUrl: RetrofitURL.baseUrl, ); Dio dio = Dio(options); dio.interceptors.add(Logging()); FormData formData = FormData.fromMap({ "keyword": req.keyword, "search": req.search, }); final response = await dio.post(RetrofitURL.contactData, data: formData); print(response); // print(response.data.runtimeType); //print(response.headers); if (response.statusCode == 200) { ContactResult result = ContactResult.fromJson(response.data); return result; } else { return ContactResult(status: "fail", message: "fail", addrinfo: null); } } } 에러 메시지 내용 I/flutter (23550): RESPONSE[200] => PATH: /androidSample/ContactList.php I/flutter (23550): {"status":"success","message":"","addrinfo":[{"idx":1,"userNM":"개발자","mobileNO":"01000010001","telNO":"0234560001","photo":"1.jpg","checkBoxState":false},{"idx":2,"userNM":"이정은","mobileNO":"01001230001","telNO":"","photo":"2.jpg","checkBoxState":false},{"idx":3,"userNM":"김홍길","mobileNO":"01001230002","telNO":"","photo":"null","checkBoxState":false},{"idx":4,"userNM":"최신형","mobileNO":"01001230003","telNO":"","photo":"4.jpg","checkBoxState":false},{"idx":5,"userNM":"홍길동","mobileNO":"01000009880","telNO":"","photo":"5.jpg","checkBoxState":false},{"idx":6,"userNM":"김아정","mobileNO":"01001230005","telNO":"","photo":null,"checkBoxState":false},{"idx":7,"userNM":"이순신","mobileNO":"01001230006","telNO":"","photo":"7.jpg","checkBoxState":false},{"idx":8,"userNM":"이정민","mobileNO":"01000010887","telNO":"","photo":null,"checkBoxState":false},{"idx":9,"userNM":"최재수","mobileNO":"01001110000","telNO":"","photo":"9.jpg","checkBoxState":false},{"idx":10,"userNM":"장정은" E/flutter (23550): [ERROR:flutter/runtime/dart_vm_initializer.cc(41)] Unhandled Exception: type '_Map<String, dynamic>' is not a subtype of type 'Contact_Item' E/flutter (23550): #0 new List.from (dart:core-patch/array_patch.dart:29:5) E/flutter (23550): #1 new ContactResult.fromJson (package:login_ex/contact/model/contact_result.dart:19:51) E/flutter (23550): #2 ContactService.getAddressData (package:login_ex/contact/repository/contact_service.dart:32:44) E/flutter (23550): <asynchronous suspension> E/flutter (23550): #3 MainScreenState.getContactData (package:login ex/contact/view/main_screen.dart:35:30) E/flutter (23550): <asynchronous suspension>

  • flutter
Link 댓글 1 좋아요 2 조회수 1907

인기 태그

인프런 TOP Writers

주간 인기글