
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:
@freezedclass 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 korurprint(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:
@freezedclass Company with _$Company { factory Company({String? name, Director? director}) = _Company;}@freezedclass Director with _$Director { factory Director({String? name, Assistant? assistant}) = _Director;}@freezedclass 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)
For further actions, you may consider blocking this person and/orreporting abuse