Flutter copyWith

이건선·2023년 7월 16일
0

Flutter

목록 보기
13/30

copyWith

주로 immutable 객체(불변 객체)를 변경하는 데에 사용됩니다. Dart에서 final 키워드를 사용하면 그 필드는 불변하게 됩니다. 따라서, 일단 생성되고 나면 그 필드의 값을 변경할 수 없습니다. 그렇다면 필드의 값을 변경하려면 어떻게 해야 할까요?

이 때 사용하는 것이 바로 copyWith 메서드입니다. 이 메서드는 현재 객체의 복사본을 만들되, 메서드의 인자로 전달된 필드만 새로운 값으로 변경하는 역할을 합니다. 만약 인자로 전달되지 않은 필드는 그대로 유지합니다.


enum Filter {
 all,
 active,
 completed,
}


class TodoFilterState extends Equatable {
 final Filter filter;
 TodoFilterState({
   required this.filter,
 });

 
 List<Object> get props => [filter];

 
 bool get stringify => true;

 TodoFilterState copyWith({
   Filter? filter,
 }) {
   return TodoFilterState(
     filter: filter ?? this.filter,
   );
 }
}

copyWith 메서드를 세부적으로 보자면

1. TodoFilterState copyWith({ Filter? filter, })

copyWith이라는 메서드를 선언하는 부분입니다. 메서드는 선택적 인자 filter를 가집니다. Filter?는 이 인자가 Filter 타입이며 null일 수 있음을 의미합니다. {} 안에 인자를 넣음으로써 이 인자가 named parameter(명명된 매개변수)임을 나타냅니다. 즉, 이 메서드를 호출할 때 filter: 값 형태로 인자를 전달해야 합니다.

2. return TodoFilterState( filter: filter ?? this.filter, );

이 부분에서는 새로운 TodoFilterState 인스턴스를 반환합니다. filter: filter ?? this.filter는 새로운 인스턴스의 filter 속성 값을 결정하는 부분입니다. filter ?? this.filter는 "만약 filter 인자가 null이 아니라면 filter를 사용하고, null이라면 this.filter를 사용하라"는 뜻입니다. 여기서 this.filter는 현재 인스턴스의 filter 값을 의미합니다.

이제 위의 예제를 사용한 예시를 보겠습니다.

void main() {
 var state1 = TodoFilterState(filter: Filter.all);
 print(state1.filter); // Output: Filter.all

 var state2 = state1.copyWith(filter: Filter.completed);
 print(state2.filter); // Output: Filter.completed
}

예시에서 state1은 필터가 Filter.all인 상태를 가지고 있습니다. 이 상태의 필터를 Filter.completed로 변경하고 싶다면, copyWith 메서드를 이용해 새로운 상태를 생성할 수 있습니다. 이 때 state1은 변경되지 않고 그대로 유지되며, state2는 새로운 필터를 가진 새로운 상태가 됩니다.

이런 방식으로 copyWith 메서드는 불변 객체의 일부 값을 변경한 새로운 객체를 만드는 데에 유용합니다.

profile
멋지게 기록하자

0개의 댓글