Freezed copyWith Method 💫 🌌 ✨

gulsenkeskin

Gülsen Keskin

Posted on March 20, 2022

Freezed copyWith Method 💫 🌌 ✨

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;
}
Enter fullscreen mode Exit fullscreen mode

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)
Enter fullscreen mode Exit fullscreen mode

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;
}
Enter fullscreen mode Exit fullscreen mode

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',
    ),
  ),
);
Enter fullscreen mode Exit fullscreen mode

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');
Enter fullscreen mode Exit fullscreen mode

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');
Enter fullscreen mode Exit fullscreen mode

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);
Enter fullscreen mode Exit fullscreen mode

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');
Enter fullscreen mode Exit fullscreen mode

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');

Enter fullscreen mode Exit fullscreen mode

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)
Enter fullscreen mode Exit fullscreen mode

Reference

💖 💪 🙅 🚩
gulsenkeskin
Gülsen Keskin

Posted on March 20, 2022

Join Our Newsletter. No Spam, Only the good stuff.

Sign up to receive the latest update from our blog.

Related