Getters и Setters в Dart и Flutter.


Как и во многих других языках getters\setters это методы которые дают доступ на чтение\запись свойств объекта.


В статье рассмотрим простые примеры и запустим их на выполнение в dartpad.



В языке Dart чтение и запись любых свойств объектов реализованы с помощью getters\setters.


Например, посмотрим на код


class Person {
  String name;
  int birthYear;

  Person(this.name, this.birthYear);
}

void main() {
  Person person = Person('username', 1990);
  print('Hello ${person.name}, you was born in ${person.birthYear}');
  person.name = 'Newusername';
  print('Hello ${person.name}, you was born in ${person.birthYear}');
}

Запустить код в Dartpad.


Каждое свойство в данном классе имеет неявный setter для записи в него и неявный getter для получения значения.


Когда мы вызываем person.name = ‘Newusername’; то мы обращаемся к setter класса. А после этого получаем его значение person.name с помощью getter.


В Dart мы можем (и это рекомендуется делать для абстракционирования кода) создавать свои getters и setters. Это позволяет нам инициализировать наши классы свойствами, а в будущем обертывать их разными методами без изменения клиентского кода.


Например, допустим наш проект с классом Person развился и нам понадобилось определять совершеннолетие. Мы можем это сделать без изменения конструктора и базовых свойств объекта.


class Person {
  String name;
  int birthYear;

  bool get isAdult => (DateTime.now().year - birthYear) > 18;

  Person(this.name, this.birthYear);
}

void main() {
  Person personAdult = Person('adultUser', 1990);
  print('Hello ${personAdult.name}, you was born in ${personAdult.birthYear}, you are 
    ${personAdult.isAdult ? 'adult' : 'not adult'}');

  Person personNotAdult = Person('adultUser', 2005);
  print('Hello ${personNotAdult.name}, you was born in ${personNotAdult.birthYear}, 
    you are ${personNotAdult.isAdult ? 'adult' : 'not adult'}');
}

Запустить код в Dartpad.


Запустив код в Dartpad мы видим, что мы добавили новое поведение класса, при этом уже созданный клиентский код не будет затронут и все продолжит работать.


Таким же образом, если в какой-то части проекта у нас появилась работа с возрастом, а не с датой рождения, то мы можем добавить setter для записи дня рождения при указании возраста.


class Person {
  String name;
  int birthYear;

  bool get isAdult => (DateTime.now().year - birthYear) > 18;

  int get age => (DateTime.now().year - birthYear);
  set age(int val) => birthYear = (DateTime.now().year - val);

  Person(this.name, this.birthYear);
}

void main() {
  Person personAdult = Person('adultUser', 1990);
  print('Hello ${personAdult.name}, you was born in ${personAdult.birthYear}, you are 
    ${personAdult.isAdult ? 'adult' : 'not adult'}');

  Person personNotAdult = Person('adultUser', 2005);
  print('Hello ${personNotAdult.name}, you was born in ${personNotAdult.birthYear}, 
    you are ${personNotAdult.isAdult ? 'adult' : 'not adult'}');

  //check how setter work
  print(personAdult.birthYear);
  personAdult.age = 5;
  print(personAdult.birthYear);
}

Запустить код в Dartpad.


Вообще getter & setter используются так часто, что в Android Studio встроено их автосоздание. Когда курсор на свойстве нажимаем Command+N (в Windows Ctrl+N) и в контекстном меню будет их создание.


Всем хорошего кодинга!

Комментарии (6)


  1. psFitz
    19.08.2019 12:51
    -1

    Автору респект. Очень полезная статья!
    Еще хотелось бы почитать про:
    1.Hello world на flutter
    2.Как создать dart файл
    3.Как написать класс на dart
    4.Как не писать бесполезные статьи


    1. awaik Автор
      19.08.2019 13:10

      Посмотрим, если никому не интересно, то удалю.
      На эту статью планировал ссылку в другой большой, в которой сложные паттерны будут.


  1. Inobelar
    19.08.2019 13:20

    Я почти не в теме Flutter, но разве статья не о геттерах/сеттерах Dart? Flutter'а (фреймворк, в отличие от ЯП) же сдесь не затрагивается вообще.


    1. awaik Автор
      19.08.2019 13:25

      Да, так и есть, просто у меня они так плотно вместе, что вот так написалось :)
      В проектах на Flutter эти 2 метода используются очень часто.


      1. RealPeha
        19.08.2019 14:38

        Потому что Flutter это фреймворк написанный на Dart и там используется всё тоже что и в Dart


  1. qmmp123
    20.08.2019 22:29

    Хотелось бы наверное пример с абстракциями раз уж про них написано в статье