해결된 질문
작성
·
470
답변 1
2
안녕하세요
상태관리라고 하는 것은 이전 값과 다음 값이 변경이 이루어 졌을때 화면에서 이를 캐치하여 화면을 갱신시켜주는 것이 주된 목적입니다.
그러면 이전 값과 다음 값이 달라졌다는것을 체크가 되어야 합니다. 기본적으로 class는 mutable한 성질이 있기 때문에 객채 내부의 맴버 변수들의 값들이
바뀐다고 해도 해당 객체는 변화 되었다고 인식하지 않습니다. 왜냐하면 변경가능한 mutable 한 속성이 기 때문이죠.
이해를 돕기 위해 다음과 같은 예제를 만들어 봤습니다. Dartpad 사이트에서 돌려보시면 이해가 되는데 도움이 되실 것입니다.
void main() {
var test = User('개발하는남자','010-xxxx-1234');
var newTest= test..updatePhone('010-yyyy-4321');
print(test == newTest); // true
}
class User{
String name;
String phone;
User(this.name,this.phone);
updatePhone(String phone){
this.phone = phone;
}
}
위 예제는 User 객체에 이름과 연락쳐를 넣었습니다. 하지만 연락처가 바뀌었다고 하면 User 객체에 연락처를 업데이트 시켜줬습니다.
이때 변경된 객체와 기존 생성한 객체를 비교하면 상태는 바뀌었지만 바뀐것을 인식하지 못합니다.
하지만 다음 예제를 보겠습니다.
void main() {
var test2 = NewUser('개발하는남자','010-xxxx-1234');
var newTest2= test2.copyWith(phone :'010-yyyy-4321');
print(test2 == newTest2); // false
}
class NewUser{
String name;
String phone;
NewUser(this.name,this.phone);
copyWith({String? name, String? phone}){
return NewUser(
name?? this.name,
phone??this.phone,
);
}
}
위 예제를 돌려보시면 test2와 newTest2 가 다르다라고 인식하게 될 것입니다. 그러므로 상태가 바뀌었다고 bloc/cubit 이 인식하게 됩니다.
그런데 의문이 드실 수 있습니다. 애초에 첫번째 예제때 새로운 객체를 만들어서 넣으면 되는거 아니냐고 생각할 수 있습니다.
다음과 같이 말이죠
void main() {
var test = User('개발하는남자','010-xxxx-1234');
var newTest= User('개발하는남자','010-yyyy-4321');
print(test == newTest); // false
}
맞습니다 위 처럼 바뀐 데이터를 새로운 객채로 만들어서 넣으면 달리 인식하여 상태관리로 상태가 바뀌었다고 인식하게 되겠습니다.
바로 이 방식이 copyWith 방식입니다. copyWith 함수를 보시면 새로운 객체를 만들어서 return 해주고 있습니다.
그럼 다시 생각해보면 반드시 copyWith를 쓸 필요가 없다는 것입니다.
cubit에서 emit 해줄때 새로운 객채로 만들어서 넣으면 동작이 될 것입니다.
단지 copyWith를 해주는 것은 개발 편의를 위해 사용하는 것입니다.
이해를 돕기 위해 설명을 드리긴 했지만 아무래도 문자로 설명드리니까 어렵게 설명드린게 아닌가 우려가 되네요 ^^;;
도움이 되셨다면 좋겠지만 만일 그래도 이해가 안가신다 하신다면 제가 조만간 이 내용관련 영상을 만들어서 유튜브에 업로드 하도록 하겠습니다.
감사합니다.
아 그렇군요 ~! 저는 dart나 flutter의 하나의 기능처럼 작동하는 것인줄 알았는데 변화를 주기위한 임의적인 이름이자 임의적인 기능이군요~! 친절하고 자세한답변 감사합니다!! ㅎ ㅎ