繁体   English   中英

飞镖中没有SuchMethod?

[英]NoSuchMethod in dart?

尝试使用 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}";

 } 

根据调用未实现方法的官方文档,您必须满足以下几点之一:

  • 接收器具有静态类型动态。
  • 接收者有一个静态类型定义了未实现的方法(抽象是可以的),而接收者的动态类型有一个与类 Object 中不同的 noSuchMethod() 的实现。

示例 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
}

非正式语言规范: 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说明。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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