inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

PaginationListView에서 제네릭 관련

해결된 질문

238

Tykan

작성한 질문수 2

3

안녕하세요. 코팩님!

[고급 캐시관리] 파트의 PaginationListView와 PaginationWidgetBuilder에서 제네릭을 처리하는 부분에 있어 타입 추론이 명확하게 되지 않는 부분이 있습니다.

class PaginationListView<T extends IModelWithId> extends ConsumerStatefulWidget {
  final StateNotifierProvider<PaginationProvider, CursorPaginationBase> provider;
  final PaginationWidgetBuilder<T> itemBuilder;

  ...

  @override
  ConsumerState<PaginationListView> createState() => _PaginationListViewState<T>();
}

class _PaginationListViewState<T extends IModelWithId> extends ConsumerState<PaginationListView> {
  ...

여기서 _PaginationListViewState 클래스는 ConsumerState<PaginationListView>를 상속 받으면서 정확하게는 ConsumerState<PaginationListView<dynamic>>을 상속하게 됩니다.

이로 인해 State클래스 내부에서 호출하는 itemBuilder는 PaginationWidgetBuilder<dynamic>으로 동작하여 실제 사용하는 코드 부분에서 itemBuilder 파라미터에 빌더 작성시 일반적으로는 아래와 같은 에러가 발생합니다.

type '(BuildContext, int, RestaurantModel) => Widget' is not a subtype of type '(BuildContext, int, IModelWithId) => Widget'

이에 builder Function 앞에 강의 내용처럼<RestaurantModel>을 선언하여 에러를 회피할 수 있지만, 이럴 경우 빌더에 전달되는 파라미터는 전부 dynamic으로 추론되는 것을 확인했습니다.


그리고, 새로운 익명함수를 정의하는 형태라 그런지 앞에 <RestaurantModel>가 아닌 아무 의미 없이 <ABC>를 적어도 빌드나 실제 앱 동작에 아무런 문제가 없습니다.

그래서 빌더 함수 내부에서model.을 입력하더라도 dynamic 이기 때문에 실제로 목표로 하는 모델의 속성들이 자동완성 제안이 되지 않고 런타임에서 대입됩니다.


class _PaginationListViewState<T extends IModelWithId> extends ConsumerState<PaginationListView<T>> {
  ...

위와 같이 State 클래스에서 선언한 제네릭 T를 이용해서 PaginationListView<T>의 ConsumerState 임을 명시했을 때, State클래스 내부의 itemBuilder가 PaginationWidgetBuilder<T>로 잘 동작했습니다.

타입이 명확하므로 builder Function에 <RestaurantModel>을 쓰지 않아도 정확한 타입을 전달해줬습니다.

마찬가지로

final StateNotifierProvider<PaginationProvider, CursorPaginationBase> provider;

이 부분도 제네릭을 명시해야 실제 해당 뷰의 모델에 맞는 프로바이더만 주입 가능하기 때문에 더 나을 것 같습니다.


dynamic이 넘어오는게 의아해서, 혼자 이리저리 해보면서 궁금증을 해결했는데 강의에 괜찮은 피드백이 될까 싶어서 글 남깁니다 :)

좋은 강의 감사드립니다.
내용이 좋아서 시간 가는 줄 모르고 꾸준히 듣고 있네요!

Flutter 하이브리드 앱

답변 1

2

코드팩토리

안녕하세요!

제가 놓친부분이 있었네요! 추후 보강하도록 하겠습니다.

말씀하신 부분 정확하고 찾아내신거 축하드립니다! 분명 한단계 성장하셨으리라 믿습니다!

감사합니다!

자동 패키지 임포트 관련 질문 드립니다.

0

652

1

초급 중급 마무리한 학생입니다.. 파베관련 질문 하나만 받아주실 수 있을까요

0

440

1

Pagination 질문드립니다

0

473

1

레이아웃에 대해서 궁금한 질문!

0

499

1

강의에 적용된 디자인 패턴이 뭔가요??

1

676

1

네스팅 방식으로 goRouter Go를 사용할때, 앱바타이틀이 정상적으로 표시되지 않는 문제

0

564

2

GoRouter return이 안됩니다.

0

598

1

UserModel 에서는 IModelWithId를 implements하지 않는 이유가 있나요?

-1

540

1

서버쪽 /user/me api에서 에러가 나서 확인해보니..

0

410

1

[에러] GoRouter 적용, 401 에러가 뜹니다

0

365

1

ref.read.update // state + 1

0

449

1

typedef itemBuilder 제네릭 관련 질문이 있습니다.

0

453

1

[상태관리] Riverpod을 쓰신 이유가 있으신가요?

0

669

1

Dio 질문드립니다.!

0

780

2

CursorPagination 캐스팅 관련 문의

0

411

1

CursorPagination 캐시팅 관련 문의

0

399

2

AuthRepository 클래스 token() 함수는 Dead Code 아닌가요?

0

362

1

Rating을 GET 요청할때 DioError가 발생합니다.

-1

609

1

Token 관련 질문 드립니다.

0

452

2

수업의 내용은 아니지만 궁금해서 여쭤봅니다.

0

575

1

refresh 토큰 재발급 요청에 대해서

0

1688

1

_App 클래스가 ConsumerWidget을 상속 받으면 에러가 생깁니다

0

2554

4

이번 플러터와 다트 업데이트에서

1

268

1

Dio로 api 요청 듣고 있는데 에러가 발생합니다 ㅜㅜ

0

1176

1