인프런 커뮤니티 질문&답변

진표님의 프로필 이미지
진표

작성한 질문수

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

RatingPagination FetchMore 적용하기

List 타입 에러

작성

·

159

0

[ERROR:flutter/runtime/dart_vm_initializer.cc(41)] Unhandled Exception: type 'List<IModelWithId>' is not a subtype of type 'List<RatingModel>?' of 'data'
#0      CursorPagination.copyWith (package:codefactory_lecture/common/model/cursor_pagination_model.dart:28:14)
#1      Pagination.paginate (package:codefactory_lecture/common/provider/pagination_provider.dart:91:22)
<asynchronous suspension>

이건 디테일 스크린에서 rating을 fetchmore로 더 불러올때 나는 에러입니다.

[ERROR:flutter/runtime/dart_vm_initializer.cc(41)] Unhandled Exception: type 'List<IModelWithId>' is not a subtype of type 'List<RestaurantModel>?' of 'data'
#0      CursorPagination.copyWith (package:codefactory_lecture/common/model/cursor_pagination_model.dart:28:14)
#1      Pagination.paginate (package:codefactory_lecture/common/provider/pagination_provider.dart:91:22)
<asynchronous suspension>

그리고 이건 restaurant_screen.dart에서 쭉 내려서 데이터를 더 불러오려고 할 때 에러입니다. 둘 다 비슷한 에러입니다.

 

        state = resp.copyWith(data: [
          ...pState.data,
          ...resp.data,
        ]);

페이지네이션 코드 중 이 부분에 문제가 있었고,

 

CursorPagination copyWith({
    CursorPaginationMeta? meta,
    List<T>? data,
  }) {
    return CursorPagination<T>(
        meta: meta ?? this.meta, data: data ?? this.data);
  }

여기서 List<T>? data의 타입이 맞지 않는 것 같습니다.

 

데이터 타입이 알맞게 각각 들어가야 할텐데, 자꾸 List<IModelWithId> 타입이 들어가는 거 같아요... 어느 부분을 고쳐야 할까요?

답변 1

1

코드팩토리님의 프로필 이미지
코드팩토리
지식공유자

안녕하세요!

혹시 타입을 State 클래스로 전달 한다음 받아보시겠어요?

그래도 안된다면 안되는 위치와 상황 정보와 함께 레포지토리 공유 부탁드립니다.

감사합니다!

진표님의 프로필 이미지
진표
질문자

감사합니다!!

        final newState = CursorPagination<T>(
            meta: pState.meta, data: [...pState.data, ...resp.data]);
        state = newState;

혹시 이렇게 하라는 말씀이신가요?? 근데 뭐 어찌되었건 이렇게 했더니 에러가 해결되긴 했습니다. 사실, 여전히 데이터는 CursorPagination<RestaurantModel>, CursorPagination<RatingModel>이 아닌, CursorPagination<IModelWithID>로 받아지기는 합니다. 이게 정상인가요??

 

그리고 데이터가 CursorPagination<IModelWithID>로 받아지기 때문에 Rating 데이터 가져오는 코드에서

            if (ratingState is CursorPagination)
              renderRatings(models: List<RatingModel>.from(ratingState.data))

이런식으로 좀 다르게 했습니다. 이렇게 하니까 잘 되더라구요. if문에 CursorPagination<RatingModel>처럼 제너릭을 명시해서 제시하면 CursorPagination<IModelWithID>에 걸리지 않아서 Rating Card 위젯들이 렌더링이 안됩니다.

코팩님께서 oop를 활용하여 코딩하는 것을 가르쳐 주고 계신데, 제가 이런식으로 해결한 것이 oop를 제대로 활용한 것인지, 아니면 그냥 dynamic으로 대충 얼버무린것인지... 잘 모르겠습니다.

 

사실은 제가 코팩님 강의를 보면서 코드를 그대로 따라치고 있지는 않고 리버팟 v2버전 강의에서 보여주신것을 따라서 riverpod_annotation을 이용하여 코딩하고 있습니다. 그래서 에러가 날때마다 너무 무섭습니다 ㅋㅋ 강의랑은 다른 코드를 작성하고 있기 때문에 ㅠㅠ

코드팩토리님의 프로필 이미지
코드팩토리
지식공유자

타입이 나오는데 dynamic인 경우는 없습니다. IModelWithId 타입이 뜬다고 하셨으니 IModelWithId 타입이고 dynamic 타입이 아닙니다.

진표님의 프로필 이미지
진표

작성한 질문수

질문하기