작성
·
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
*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,
}
0
안녕하세요, 인프런 AI 인턴입니다. mhlee님께서 질문하신 내용을 확인했습니다. sealed class
를 사용하는 경우에 The getter 'orderType' isn't defined for the type 'NoteOrder<dynamic>'
오류가 발생하는 문제에 대해 안내해 드리겠습니다.
sealed class
구조에서 orderType
이라는 getter가 정의되지 않았거나, Dart가 이를 인식하지 못하고 있는 상황입니다. sealed class
에서 하위 클래스들은 모든 필드를 조회할 수 있도록 getter를 제공해야 합니다. 하지만 모든 하위 클래스에서 무조건적으로 동일한 필드를 제공하면 유연성이 떨어질 수 있습니다.
정확한 정의:
NoteOrder
클래스에 orderType
이라는 getter를 추가함으로써, 모든 하위 클래스는 이 필드를 제공해야 합니다. 이는 올바른 접근 방식으로 보입니다. 하지만, 만약 특정 하위 클래스가 orderType
을 필요로 하지 않는다면, 아래와 같은 구조로 유연성을 확보할 수 있습니다.
조건부 인터페이스 구현:
특정 버전의 NoteOrder
클래스만 orderType
을 제공하도록 변화시킬 수 있습니다. 각 하위 클래스에서 필요에 따라 orderType
을 제공하도록 설계할 수 있습니다.
강제성 완화:
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
을 구현하지 않도록 선택할 수 있습니다.
sealed class
내 데이터 접근 문제에 대한 논의입니다.freezed
패키지로 인해 발생하는 문제와 해결 방법을 안내합니다.저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
감사합니다!