인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

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

mhlee님의 프로필 이미지

작성한 질문수

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

28 두 번째 ViewModel 작성

sealed class 사용 문의

작성

·

66

·

수정됨

0

안녕하세요 강의중에 freezed3.0 변경 이후

sealed class 작성과 view_model에서 사용을 제대로 사용하고 있는지 문의드립니다.

 

*

1.switch 문 키워드 사용

ex case SaveNote(:final id, :final title, :final content):

2.viewModel class 연결부분

ex _changeColor(color);

 

AddEditNoteEvent(sealed class)코드

 

sealed class AddEditNoteEvent<T> {
  factory AddEditNoteEvent.changeColor(int color) = ChangeColor;
  factory AddEditNoteEvent.saveNote(int? id, String title, String content) =
      SaveNote;
}

class ChangeColor<T> implements AddEditNoteEvent<T> {
  final int color;
  ChangeColor(this.color);
}

class SaveNote<T> implements AddEditNoteEvent<T> {
  final int? id;
  final String title;
  final String content;
  SaveNote(this.id, this.title, this.content);
}

 

 

view model(onEvent)- 코드

 

import 'package:flutter/material.dart';
import 'package:flutter_note_app/domain/model/note.dart';
import 'package:flutter_note_app/domain/repository/note_repository.dart';
import 'package:flutter_note_app/presentation/add_edit_note/add_edit_note_event.dart';

class AddEditNoteViewModle with ChangeNotifier {
  final NoteRepository repository;

  int _color = Colors.orange.value;
  int get color => _color;

  AddEditNoteViewModle(this.repository);

  void onEvent(AddEditNoteEvent event) {
    switch (event) {
      case ChangeColor(:final color):
        _changeColor(color);
        break;
      case SaveNote(:final id, :final title, :final content):
        _saveNote(id, title, content);
        break;
    }
  }

  Future<void> _changeColor(int color) async {
    _color = color;
    notifyListeners();
  }

  Future<void> _saveNote(int? id, String title, String content) async {
    if (id == null) {
      await repository.inserNote(
        Note(
          title: title,
          content: content,
          color: _color,
          timestamp: DateTime.now().millisecondsSinceEpoch,
        ),
      );
    } else {
      await repository.updateNote(
        Note(
          id: id,
          title: title,
          content: content,
          color: _color,
          timestamp: DateTime.now().millisecondsSinceEpoch,
        ),
      );
    }
  }
}

답변 2

0

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

네. 잘 사용하고 계십니다.

sealed 클래스 작성시 직접 작성 및 freezed 사용해도 되고요.

sealed 클래스를 switch 에서 분기 할 때 자동완성으로 파라미터를 생략해서 다음과 같이 접근도 가능합니다.

switch (event) {
  case ChangeColor():
    _changeColor(event.color);
    break;
  case SaveNote():
    _saveNote(event.id, event.title, event.content);
    break;
}
mhlee님의 프로필 이미지
mhlee
질문자

감사합니다 이해가 잘되는 플러터 강의입니다

0

인프런 AI 인턴님의 프로필 이미지

안녕하세요, 인프런 AI 인턴입니다. mhlee님께서 질문하신 내용은 freezed3.0 변경 이후 sealed class 작성과 view_model에서의 사용 방법과 관련된 것이군요.

문제 해결 방안 및 설명:

  1. switch 문 사용:

    • Dart에서 sealed class를 사용할 때, 모든 하위 클래스에 대해 switch 문을 사용할 수 있습니다. 이는 각 이벤트에 대해 특정 동작을 수행할 수 있도록 하기 위함입니다. sealed class의 인스턴스가 어떤 타입인지를 switch 문을 통해 확실하게 확인할 수 있습니다.
  2. ViewModel과의 연결 부분:

    • sealed class를 사용하여 이벤트를 관리할 때, viewModel 내에서 각 이벤트에 맞는 처리 로직을 구현할 수 있습니다. switch문에서 각 이벤트 클래스에 맞는 메서드를 호출하여 원하는 기능을 수행하도록 하면 됩니다.
  3. 작성하신 AddEditNoteEventViewModel의 적절성:

    • AddEditNoteEvent 클래스는 sealed class의 패턴에 맞게 잘 작성되어 있습니다. 각 이벤트를 독립된 클래스로 선언하여 관리하고 있어, 명확하고 응집력 있는 설정입니다.
    • ViewModel에서 onEvent 메서드의 switch 문도 적절하게 작성하셨습니다. 이벤트에 따라 _changeColor_saveNote 메서드를 호출하여 원하는 기능을 구현하고 있습니다.

아래는 참고할 만한 유사한 Q&A 링크입니다:
- g.dart 파일이 생성이 안됩니다.: 이를 통해 오타로 인한 문제 및 해결 방법을 확인해 보실 수 있습니다.
- sealed class 데이터 접근: sealed class 관련 데이터 접근 문제에 대한 논의입니다.

기존의 작성된 코드가 잘 구성되어 있으므로, 그대로 진행하셔도 무방합니다. 추가로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏

mhlee님의 프로필 이미지

작성한 질문수

질문하기