Inflearn brand logo image

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

mhlee님의 프로필 이미지
mhlee

작성한 질문수

Flutter 중급 1편 - 클린 아키텍처

38 정렬 기능 작성

sealed class 사용시 The getter 'orderType' isn't defined for the type 'NoteOrder<dynamic>' 오류

작성

·

62

0

The getter 'orderType' isn't defined for the type 'NoteOrder<dynamic>' 오류 관련으로 문의드립니다.

 

sealed class에서 noteOrder.orderType를 접근할때 *참고사진1의 오류가 발생했습니다.

해당 오류는 sealed class 내부에 noteOrder.orderType에 접근 할수 없다라는 내용으로

 

*참고코드 2에서 *참고코드 3와 같이 sealed class에서 getter를 선언하고 각 클래스에서 해당 값을 사용할수 있도록 @override로 수정했으나 의문점이 생겨 문의드립니다.

 

1.*참고코드3 sealed class 수정사항이 맞는지 궁금합니다.

2.*참고코드3 사항이 맞는 경우 sealed class에서 getter로 OrderType get orderType; 사용했다면

나머지 class부분에서 orderType를 강제로 구현을 해야하기 때문에 orderType를 사용하지 않는 class 작성시 문제가 될것 같습니다. 혹시 해당 사항에서는 어떻게 해야할찌 궁금합니다.

 

 

*오류 내용

*참고사진1

image.png

 

*order_section.dart

*참고 수정코드1

import 'package:flutter/material.dart';
import 'package:flutter_note_app/domain/model/util/note_order.dart';

class OrderSection extends StatelessWidget {
  final NoteOrder noteOrder;
  final Function(NoteOrder noteOrder) onOrderChanged;
  const OrderSection({
    super.key,
    required this.noteOrder,
    required this.onOrderChanged,
  });

  @override
  Widget build(BuildContext context) {
    return Column(
      children: [
        Row(
          children: [
            Radio<NoteOrder>(
              value: NoteOrder.title(noteOrder.orderType),
              groupValue: noteOrder,
              onChanged: (NoteOrder? value) {
                onOrderChanged(NoteOrder.title(noteOrder.orderType));
              },
            ),
          ],
        ),
      ],
    );
  }
}

 

*note_order.dart

*참고 코드2

import 'package:flutter_note_app/domain/model/util/order_type.dart';

sealed class NoteOrder<T> {
  factory NoteOrder.title(OrderType orderType) = NoteOrderTitle;
  factory NoteOrder.date(OrderType orderType) = NoteOrderDate;
  factory NoteOrder.color(OrderType orderType) = NoteOrderColor;
}

class NoteOrderTitle<T> implements NoteOrder<T> {
  OrderType orderType;
  NoteOrderTitle(this.orderType);
}

class NoteOrderDate<T> implements NoteOrder<T> {
  OrderType orderType;
  NoteOrderDate(this.orderType);
}

class NoteOrderColor<T> implements NoteOrder<T> {
  OrderType orderType;
  NoteOrderColor(this.orderType);
}

*참고 코드3(수정함)

import 'package:flutter_note_app/domain/model/util/order_type.dart';

sealed class NoteOrder<T> {
  OrderType get orderType;

  factory NoteOrder.title(OrderType orderType) = NoteOrderTitle;
  factory NoteOrder.date(OrderType orderType) = NoteOrderDate;
  factory NoteOrder.color(OrderType orderType) = NoteOrderColor;
}

class NoteOrderTitle<T> implements NoteOrder<T> {
  @override
  OrderType orderType;
  NoteOrderTitle(this.orderType);
}

class NoteOrderDate<T> implements NoteOrder<T> {
  @override
  OrderType orderType;
  NoteOrderDate(this.orderType);
}

class NoteOrderColor<T> implements NoteOrder<T> {
  @override
  OrderType orderType;
  NoteOrderColor(this.orderType);
}

 

- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요!
- 먼저 유사한 질문이 있었는지 검색해보세요.
- 서로 예의를 지키며 존중하는 문화를 만들어가요.
- 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.

답변 2

1

오준석님의 프로필 이미지
오준석
지식공유자

불필요한 T 를 제거하고, 공통 필드는 한쪽에 몰아도 될 것 같습니다.

 

sealed class NoteOrder {
  final OrderType orderType;
  
  const NoteOrder(this.orderType);
  
  factory NoteOrder.title(OrderType orderType) = NoteOrderTitle;
  factory NoteOrder.date(OrderType orderType) = NoteOrderDate;
  factory NoteOrder.color(OrderType orderType) = NoteOrderColor;
}

class NoteOrderTitle extends NoteOrder {
  const NoteOrderTitle(super.orderType);
}

class NoteOrderDate extends NoteOrder {
  const NoteOrderDate(super.orderType);
}

class NoteOrderColor extends NoteOrder {
  const NoteOrderColor(super.orderType);
}

 

참고로, 이 경우에는 단순 정렬 타입을 표현하는 것이라서 enum 으로도 충분합니다. 두 방식 중에서 편한 것을 사용하시면 됩니다.

enum NoteOrder {
  title,
  date,
  color,
}

enum OrderType {
  ascending,
  descending,
}
mhlee님의 프로필 이미지
mhlee
질문자

감사합니다!

0

안녕하세요, 인프런 AI 인턴입니다. mhlee님께서 질문하신 내용을 확인했습니다. sealed class를 사용하는 경우에 The getter 'orderType' isn't defined for the type 'NoteOrder<dynamic>' 오류가 발생하는 문제에 대해 안내해 드리겠습니다.

문제의 핵심

sealed class 구조에서 orderType이라는 getter가 정의되지 않았거나, Dart가 이를 인식하지 못하고 있는 상황입니다. sealed class에서 하위 클래스들은 모든 필드를 조회할 수 있도록 getter를 제공해야 합니다. 하지만 모든 하위 클래스에서 무조건적으로 동일한 필드를 제공하면 유연성이 떨어질 수 있습니다.

문제 해결 방안

  1. 정확한 정의:
    NoteOrder 클래스에 orderType이라는 getter를 추가함으로써, 모든 하위 클래스는 이 필드를 제공해야 합니다. 이는 올바른 접근 방식으로 보입니다. 하지만, 만약 특정 하위 클래스가 orderType을 필요로 하지 않는다면, 아래와 같은 구조로 유연성을 확보할 수 있습니다.

  2. 조건부 인터페이스 구현:
    특정 버전의 NoteOrder 클래스만 orderType을 제공하도록 변화시킬 수 있습니다. 각 하위 클래스에서 필요에 따라 orderType을 제공하도록 설계할 수 있습니다.

  3. 강제성 완화:
    sealed class에 너무 강제적인 인터페이스 구현을 요구하는 것은 유연성을 떨어뜨릴 수 있습니다. 필요에 따라 orderType을 정의하지 않는 선택 사항으로 남길 수 있습니다.

제안된 해결 방법:

abstract class NoteOrder<T> {
  OrderType? get orderType => null; // Default implementation

  factory NoteOrder.title(OrderType orderType) = NoteOrderTitle;
  factory NoteOrder.date(OrderType orderType) = NoteOrderDate;
  factory NoteOrder.color(OrderType orderType) = NoteOrderColor;
}

class NoteOrderTitle<T> implements NoteOrder<T> {
  @override
  final OrderType orderType;
  NoteOrderTitle(this.orderType);
}

class NoteOrderDate<T> implements NoteOrder<T> {
  @override
  final OrderType orderType;
  NoteOrderDate(this.orderType);
}

class NoteOrderColor<T> implements NoteOrder<T> {
  @override
  final OrderType orderType;
  NoteOrderColor(this.orderType);
}

위와 같은 구조는 NoteOrder의 모든 하위 클래스가 orderType을 강제로 가지도록 요구하는 것이 아니라, 필요에 따라 사용할 수 있도록 합니다. 특정 하위 클래스에서는 orderType을 구현하지 않도록 선택할 수 있습니다.

참고할만한 Q&A

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

mhlee님의 프로필 이미지
mhlee

작성한 질문수

질문하기