#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 они не являются реальными объектами).