본문 바로가기
[개발] 이야기/[Flutter] 이야기

flutter - sealed class 상태 패턴 사용 방법(freezed when legacy)

by 헤이나우
반응형

freezed 라이브러리의 when 함수를 사용하여 상태관리 패턴을 사용했었는데 공식 문서(pub.dev)에 legacy라는 라벨이 붙어있는걸 보고 버전업 되면 언젠가는 없어지겠구나 생각이 들었습니다.

 

그러면 어떻게 해야하나 찾아보다 3.0버전에서 새로나온 sealed class를 사용하면 아주 깔끔하게 해결할 수 있더군요

 

그럼 여기서 어떻게 사용하는지 정리해 보도록 하겠습니다.

 

참고 : 상태 패턴은 해당 상태(클래스)에 따라서 여러가지 분기를 가질수 있도록 하는 방법으로 여러 복작한 논리들을 여러가지 클래스로 정의하여 관리할수 있는 장점이 있습니다. 이는  여러사람이 하나의 기능을 만들때 아주 요긴하게 사용됩니다.

 

1. 상태패턴 sealed class 정의

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

2. sealed class implements

위에서 팩토리 생성자에 주입한 클래스를 정의한다.

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

class SaveNote implements AddEditNoteEvent {
  int? id;
  final String title;
  final String content;

  SaveNote(this.id, this.title, this.content);
}

3. 해당 상태 클래스 사용

보면 onEvent의 함수가 호출되면 파라미터로 전달된 event에 따라서 switch에서 분기 할 수 있다.

switch함수에 event를 넣고 자동완성 단축키를 누르면 자동으로 해당 클래스를 implements한 클래스 들이 자동으로 case함수에 추가됩니다.

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

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

4. 호출

이런식으로 호출하여 사용하면 됩니다.

onEvent(AddEditNoteEvent.changeColor(1));

 

 

switch문데 정의한 클래스를 넣으면 해당 클래스를 implements한 클래스들이 자동으로 케이스문에 추가되는 기능때문에 아주 유용하게 사용할 거 같습니다.

확실히 이 패턴을 많이 사용하면 코드가 많이 간결해 지는것을 알 수 있습니다.

반응형

댓글