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

엄태호님의 프로필 이미지
엄태호

작성한 질문수

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

PaginationListView 위젯 작업하기

안녕하세요 제너릭 관련하여 질문이 있습니다.

작성

·

202

0

 

 

안녕하세요. 해당 강의에 질문이 있어서 글을 남깁니다.

 

  1. 강의에 소개된대로 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),
        );
      },
    );

 

  1. 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>();
}

제가 생각한 해석방식은 이렇습니다.

  1. PaginationListView 생성 시 ImodelWithId를 extend 한T 타입을 제너릭으로 받습니다.

  2. 따라서 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'

 

 

답변 1

0

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

안녕하세요!

혹시 State 클래스에 T 타입 전달을 안해줘서 그런게 맞을까요?

감사합니다!

엄태호님의 프로필 이미지
엄태호
질문자

State 클래스가 어떤건가요?

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

stateful widget의 상태 클래스인 state 클래스 말슴 드린거였습니다. 레포지토리 그대로 전달주시면 제가 봐드리겠습니다.

엄태호님의 프로필 이미지
엄태호

작성한 질문수

질문하기