inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

38 정렬 기능 작성

sealed class 사용시 기능은 동작하지만 Radio위젯에 선택 표시가 안되는 부분 질문

117

mhlee

작성한 질문수 15

0

sealed class 사용시 Radio위젯에 선택 표시가 안되는 이유는

 

Radio위젯에 value == groupValue 값이 같아도 객체 참고가 다르기 때문에 발생되는 것으로 확인했습니다.

 

orderType비교시 == 값이 같은 경우 가능하도록 내용을 수정했는데 제대로 수정했는지 궁금해서 문의드립니다. *참조코드 2 내용

 

1.*참조코드 2 내용 수정이 잘되었는지 확인

2.freezed 사용시 자동으로 만들어 주는 부분인데 seald 클래스 사용시 팁이 있는지 궁금합니다.

 3.copyWith 부분도 추가하는 형태도 궁금합니다.

 

참조코드 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));
              },
              activeColor: Colors.white,
            ),
            const Text('제목'),
            Radio<NoteOrder>(
              value: NoteOrder.date(noteOrder.orderType),
              groupValue: noteOrder,
              onChanged: (NoteOrder? value) {
                onOrderChanged(NoteOrder.date(noteOrder.orderType));
              },
              activeColor: Colors.white,
            ),
            const Text('날짜'),
            Radio<NoteOrder>(
              value: NoteOrder.color(noteOrder.orderType),
              groupValue: noteOrder,
              onChanged: (NoteOrder? value) {
                onOrderChanged(NoteOrder.color(noteOrder.orderType));
              },
              activeColor: Colors.white,
            ),
            const Text('색상'),
          ],
        ),
      ],
    );
  }
}

 

참조코드 2

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

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;

  @override
  bool operator ==(Object other) {
    return runtimeType == other.runtimeType &&
        other is NoteOrder &&
        other.orderType == orderType;
  }

  @override
  int get hashCode => Object.hash(runtimeType, orderType);
}

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

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

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

 

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

flutter ios android

답변 2

0

오준석

동등성 비교 규칙 재정의 잘 하셨습니다.

freezed 로 sealed class 를 생성하면 동등성 비교와 copyWith, toString 모두 재정의가 됩니다.

0

인프런 AI 인턴

안녕하세요, 인프런 AI 인턴입니다. mhlee님께서 질문하신 내용을 확인했습니다. sealed class를 사용하는 경우 Radio 위젯에서 선택 표시가 되지 않는 문제와 관련된 문의를 주셨습니다. 이는 객체 참조가 다른 경우 발생할 수 있으며, == 연산자를 오버라이드하여 문제를 해결하신 것으로 보입니다. 이를 통해 객체의 내용이 같은 경우 동일한 객체로 인식되도록 함으로써 선택 표시에 문제가 없도록 처리할 수 있습니다.

핵심 문제 및 해결 방안 요약:

  1. 객체 비교의 문제:

    • Radio 위젯에서 valuegroupValue가 동일한지를 비교할 때, 객체의 내용이 같아도 참조가 다르면 선택 표시가 되지 않을 수 있습니다.
  2. == 연산자 오버라이드:

    • NoteOrder 클래스에 == 연산자를 오버라이드하여 두 객체의 orderType이 같으면 동일한 객체로 인식되도록 수정하셨습니다. 이는 문제를 해결하는 올바른 접근 방식입니다.
    • hashCode를 오버라이드하여 == 연산자와 일관되게 동작하도록 하는 것도 필수적이며, 잘 구현하셨습니다.

Freezed 사용 시와의 비교:

  • Freezed를 사용한 자동 생성:
    • freezed 패키지는 불변 객체 생성을 위한 자동화된 코드를 제공하며, == 연산자 오버라이드 및 hashCode를 자동으로 생성합니다.
    • sealed class를 직접 구현하는 경우, 이 작업을 수동으로 해야 하지만, freezed를 사용하면 코드를 더 간결하게 유지할 수 있습니다.

추가 팁:

  • sealed class에서 불변성을 보장하고 싶다면, 필드를 final로 선언하는 것을 고려해 보세요.
  • 불변성은 특히 상태 관리에 있어 유용하며 코드의 버그 발생 가능성을 줄여줍니다.

관련 질문으로 참고할 수 있는 게시물은 다음과 같습니다:
- sealed class 데이터 접근: sealed class 내 데이터 접근 문제에 대한 논의입니다.

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

MVVM, 클린 아키텍처 관련 질문 있습니다.

0

85

2

가끔씩 ui가 깨지는? 현상이 있어서 질문드립니다.

0

91

1

freezed 3.0 대응된 코드 깃헙에도 업데이트 해주실 수 있으신가요?

0

176

3

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

0

92

2

유즈케이스 관련하여 질문 드립니다.

0

91

1

mockito사용시 오류 해결법

1

122

2

sealed class 사용 문의2

0

74

2

sealed class 사용 문의

0

116

2

freezed3.0에서 build시 when생성되지 않습니다.

0

263

2

Try implementing the missing methods, or make the class abstract. 문제해결 공유

0

235

2

This is likely caused by a misconfigured builder definition. 오류 해결 방법

1

315

3

강의 화면이 안보여요

0

133

3

Flutter에서 추천하는 Navigator, Router

0

322

2

The following ProgressEvent object was thrown resolving an image codec: [object ProgressEvent]

0

324

3

event와 ui_event

0

211

1

코드 색깔 관련 질문

0

207

1

Photo.fleezed.dart,photo.g.dart삭제시 에러

0

203

2

sealed class 적용 시...

0

325

1

클린 아키텍처 질문

0

307

1

sealed class 데이터 접근

0

322

1

서버에서 데이터를 가져와서 사용하는 경우...

0

230

1

뷰/뷰모델 작성 질문

0

269

1

freezed JsonKey 사용 예시 공유

1

789

1

아이폰에서 APP 실행 안되는 현상

0

640

1