본문 바로가기
Flutter

bloc에서 copyWith을 직접만들면 안되는 이유

by 붕어사랑 티스토리 2024. 12. 30.
반응형

 

 

흔히보는 copyWith의 코드는 아래와 같다.

이 코드의 문제점은 어떤 값을 명시적으로 null로 하고 싶은데 null이 되지 않는다.

void main() {
  User user = User(name: "abc", age:34);
  
  print("${user.name} ${user.age}");
  user.copyWith(name:null);
  print("${user.name} ${user.age}");

  
}




class User {
  final String? name;
  final int? age;

  User({this.name, this.age});

  User copyWith({
    String? name,
    int? age,
  }) {
    return User(
      name: name ?? this.name,
      age: age ?? this.age,
    );
  }
}
abc 34
abc 34

 

 

 

 

 

해결방법은 아래와 같이 텅빈 객체를 이용하여 텅빈 객체와 null을 확실히 구분시켜준다.

그러면 텅빈 인풋과, 명시적인 null 인풋을 구분할수 있게 된다.

 

void main() {
  User user = User(name: "abc", age: 34);

  print("${user.name} ${user.age}");
  user = user.copyWith(name: null);
  print("${user.name} ${user.age}");
}


class User {
  final String? name;
  final int? age;

  User({this.name, this.age});

  User copyWith({
    Object? name = const _Unset(),
    Object? age = const _Unset(),
  }) {
    return User(
      name: name is _Unset ? this.name : name as String?,
      age: age is _Unset ? this.age : age as int?,
    );
  }
}

class _Unset {
  const _Unset();
}

 

abc 34
null 34
반응형

댓글