Методы расширения геттера и сеттера

#dart #extension-methods #getter-setter

Вопрос:

Как я могу добавить методы расширения геттера и сеттера, как показано ниже? Приведенное ниже не работает, потому _foo что оно не определено, а установка foo прямого «нравится set foo(val) => foo = val; » создает бесконечный цикл.

 extension on Uri {
  String get foo => _foo;
  set foo(val) => _foo = val;
}

main() {
  var uri = Uri();
  uri.foo = 'bar';
}
 

Комментарии:

1. На самом деле это не имеет никакого отношения к методам получения/установки. У вас была бы та же проблема с любым методом расширения. По сути, ваша проблема заключается в том, что вы хотите добавить элемент данных в экземпляр объекта, но это не то, что могут сделать статические методы расширения. Возможно, вы могли бы найти свои методы this в каком-нибудь глобальном Expando экземпляре, но убедитесь, что вы прочитали предостережения об использовании Expando .

Ответ №1:

Если вы хотите хранить данные об Uri объекте, вам нужно место для их хранения. Вы не можете объявить поля расширения, потому что расширения не изменяют класс, который они расширяют, поэтому они не могут добавлять хранилище в объект.

Что вы можете сделать, так это использовать Expando :

 extension on Uri {
  static final _storage = Expando<String>();
  String get foo => _storage[this];
  set foo(String value) {
    _storage[this] = value;
  }
}
 

An Expando предназначен для добавления хранилища «на стороне» для любого объекта без утечки хранилища, когда объекты собирают мусор.
(Вы не можете использовать его для хранения значений в строках, числах, логических значениях или null , потому что это специальные записи. идентификатор, потому что вы можете создавать их из литералов … и потому что в JavaScript они не являются реальными объектами).