Gülsen Keskin
Posted on March 20, 2022
copyWith
copyWith methodu farklı değerlere sahip nesneleri klonlamayı sağlar.
Not: Birçok alternatifin aksine, Freezed kullanılırken copyWith yöntemi bir değere null değer atamayı doğru şekilde destekler.
Örnek olarak bir Person sınıfını ele alacak olursak:
@freezed
class Person with _$Person {
factory Person(String name, int age) = _Person;
}
O zaman şunu yazabiliriz:
var person = Person('Remi', 24);
// `age` değiştirilmedi, değerini korur
print(person.copyWith(name: 'Dash')); // Person(name: Dash, age: 24)
// `age` `null` olarak ayarlandı
print(person.copyWith(age: null)); // Person(name: Remi, age: null)
CopyWith'in null parametreleri nasıl doğru bir şekilde anlayabildiğine dikkat edin.
Deep copy
Aşağıdaki sınıfları göz önünde bulunduracak olursak:
@freezed
class Company with _$Company {
factory Company({String? name, Director? director}) = _Company;
}
@freezed
class Director with _$Director {
factory Director({String? name, Assistant? assistant}) = _Director;
}
@freezed
class Assistant with _$Assistant {
factory Assistant({String? name, int? age}) = _Assistant;
}
Ardından, Company ile ilgili bir referanstan Assistant üzerinde değişiklikler yapmak isteyebiliriz.
Örneğin, bir asistanın name alanını değiştirmek için copyWith kullanarak şunu yazmamız gerekir:
Company company;
Company newCompany = company.copyWith(
director: company.director.copyWith(
assistant: company.director.assistant.copyWith(
name: 'John Smith',
),
),
);
Bu işe yarar, ancak birçok kopya ile nispeten ayrıntılıdır. Burada Freezed'in "deep copy"sini kullanabiliriz.
Company company;
Company newCompany = company.copyWith.director.assistant(name: 'John Smith');
Bu snippet, önceki snippet'le (güncellenmiş bir assistant name ile yeni bir company oluşturma) kesinlikle aynı sonucu elde edecek, ancak artık kopyaları yok.
Company company;
Company newCompany = company.copyWith.director(name: 'John Doe');
Genel olarak, yukarıda bahsedilen Company/Director/Assistant tanımlarına göre, aşağıdaki tüm "copy" sözdizimleri çalışacaktır:
Company company;
company = company.copyWith(name: 'Google', director: Director(...));
company = company.copyWith.director(name: 'Larry', assistant: Assistant(...));
company = company.copyWith.director.assistant(name: 'John', age: 42);
Boş değerlendirme-Null consideration
Bazı nesneler de boş olabilir. Örneğin, Company sınıfımızı kullanarak, Director null olabilir.
Buna göre aşağıdakini yazmak mantıklı değil:
Company company = Company(name: 'Google', director: null);
Company newCompany = company.copyWith.director.assistant(name: 'John');
Başta director yoksa director'ün asistanını değiştiremeyiz.\
Bu durumda, company.copyWith.director null değerini döndürür ve önceki örneğimiz null istisnasıyla sonuçlanır.
Düzeltmek için ?. operatör'ünü kullanabiliriz.
Company? newCompany = company.copyWith.director?.assistant(name: 'John');
Ayrıca copyWith'i tüm constructor'larda tanımlanan propertilerle kullanabilirsiniz:
var example = Example.person('Remi', 24);
print(example.copyWith(name: 'Dash')); // Example.person(name: Dash, age: 24)
example = Example.city('London', 8900000);
print(example.copyWith(name: 'Paris')); // Example.city(name: Paris, population: 8900000)
Posted on March 20, 2022
Join Our Newsletter. No Spam, Only the good stuff.
Sign up to receive the latest update from our blog.