Нет такого метода в дротике? - PullRequest
0 голосов
/ 13 декабря 2018

Получение предупреждения при попытке использовать noSuchMethod ().

Метод не определен для класса Person.

Нов соответствии с документами и другими примерами, всякий раз, когда мы вызываем несуществующий член, вызывается noSuchMethod ().Чье поведение по умолчанию - выбрасывать noSuchMethodError.

 void main() {
    var person = new Person();
    print(person.missing("20", "Shubham")); // is a missing method!
 }

 class Person {

    @override
    noSuchMethod(Invocation msg) => "got ${msg.memberName} "
                      "with arguments ${msg.positionalArguments}";

 } 

Ответы [ 2 ]

0 голосов
/ 13 декабря 2018

Согласно официальным документам для вызова нереализованного метода, вы должны удовлетворить один из следующих пунктов:

  • Получатель имеет статический тип динамический.
  • Получатель имеет статический тип, который определяет не реализованный метод (аннотация в порядке), а динамический тип получателя имеет реализацию noSuchMethod (), которая отличается от реализации в классе Object.

Пример 1: Уточняет первую точку

class Person {
  @override  //overring noSuchMethod
    noSuchMethod(Invocation invocation) => 'Got the ${invocation.memberName} with arguments ${invocation.positionalArguments}';
}

main(List<String> args) {
  dynamic person = new Person(); // person is declared dynamic hence staifies the first point
  print(person.missing('20','shubham'));  //We are calling an unimplemented method called 'missing'
}

Пример 2: Устанавливает первую точку

class Person {
  missing(int age,String name);

  @override //overriding noSuchMethod
    noSuchMethod(Invocation invocation) => 'Got the ${invocation.memberName} with arguments ${invocation.positionalArguments}';
}

main(List<String> args) {
  dynamic person = new Person(); //person could be var, Person or dynamic
  print(person.missing(20,'shubham')); //calling abstract method
}
0 голосов
/ 13 декабря 2018

Неофициальная языковая спецификация: https://github.com/dart-lang/sdk/blob/master/docs/language/informal/nosuchmethod-forwarding.md

tl; dr, вы можете вызывать методы, которые не реализованы, если:

Вызывающий объект имеет динамический тип Вызывающий супер-типы имеют тот метод, который определил (даже абстрактно) Конкретно, в Dart 2 больше не действует:

@proxy
class A {
  noSuchMethod(_) => 'Hello';
}

main() {
  // Static analysis error, will refuse to build.
  print(new A().sayHello());
}

Относится к объяснению matanlurey .

...