简体   繁体   中英

NoSuchMethod in dart?

Getting warning while trying to use noSuchMethod().

The method missing isn't defined for the class Person.

But according to the docs and other examples, whenever we call a non-existing member then, noSuchMethod() should be called. Whose default behavior is to throw 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}";

 } 

According to the official docs for invoking an unimplemented method, you have to satisfy one of the following points:

  • The receiver has the static type dynamic.
  • The receiver has a static type that defines the unimplemented method (abstract is OK), and the dynamic type of the receiver has an implemention of noSuchMethod() that's different from the one in class Object.

Example 1 : Satifies Point First

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'
}

Example 2 : Satifies Point Second

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
}

Informal language specification: https://github.com/dart-lang/sdk/blob/master/docs/language/informal/nosuchmethod-forwarding.md

tl;dr, you can only call methods that aren't implemented if:

The caller is of type dynamic The caller's super-types have that method that defined (even abstractly) Concretely, the following is no longer valid in Dart 2:

 @proxy class A { noSuchMethod(_) => 'Hello'; } main() { // Static analysis error, will refuse to build. print(new A().sayHello()); } 

Refers to matanlurey explanation.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM