PaginationListView에서 제네릭 관련
안녕하세요. 코팩님!
[고급 캐시관리] 파트의 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이 넘어오는게 의아해서, 혼자 이리저리 해보면서 궁금증을 해결했는데 강의에 괜찮은 피드백이 될까 싶어서 글 남깁니다 :)
좋은 강의 감사드립니다.
내용이 좋아서 시간 가는 줄 모르고 꾸준히 듣고 있네요!
답변 1
자동 패키지 임포트 관련 질문 드립니다.
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





