Как создать статический метод расширения в Dart?

Я пытаюсь создать статический метод расширения для один из моих классов (который создается автоматически, поэтому я не могу легко его изменить). Согласно документам, это должно быть возможно:

Расширения также могут иметь статические поля и статические вспомогательные методы.

Но даже этот небольшой пример не компилируется:

extension Foo on String {
  static String foo() => 'foo!';
}

void main() {
  print(String.foo());
}
Error: Method not found: 'String.foo'.
  print(String.foo());
               ^^^

Что я делаю не так?


person Thomas    schedule 13.05.2020    source источник


Ответы (2)


Документация означает, что сами классы расширений могут иметь static полей и вспомогательных методов. Это не будут расширения расширенного класса. То есть в вашем примере Foo.foo() допустимо, а String.foo() — нет.

В настоящее время вы не можете создавать методы расширения, которые являются static. См. https://github.com/dart-lang/language/issues/723.

Обратите внимание, что вы также можете увидеть методы расширения Dart, называемые «статическими методами расширения», но «статический» означает, что расширения применяются статически (т. е. на основе типа объекта, известного во время компиляции, а не его типа во время выполнения).

person jamesdlin    schedule 13.05.2020
comment
Спасибо, канонический ответ! Мне было трудно искать из-за этих статических методов расширения, а также из-за статической типизации в сочетании с методами расширения, которые, должно быть, заглушали результаты, которые я искал. - person Thomas; 14.05.2020

Как упомянул Джеймс, на сегодняшний день вы не можете использовать статический метод непосредственно в расширенном классе, текущим решением вашей проблемы будет:

extension Foo on String {
  String foo() => 'foo!';
}

void main() {
  print('Hi'.foo());
}
person CopsOnRoad    schedule 14.05.2020
comment
Мой фактический класс является абстрактным. - person Thomas; 14.05.2020