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)
Top comments (0)