定义一个在Dart中获取参数的getter

sni*_*tko 6 getter dart

我想定义一个可以选择接受参数的getter.我设法实现了这个目标,但只有()在通话结束后我才能使用强制性功能.这是代码:

get children => ([role=null]) {
  if(role == null || role == 'any') { return _children;               }
  else                              { return _children_by_role[role]; }
};
Run Code Online (Sandbox Code Playgroud)

所以现在我可以说

obj.children('something').length;
Run Code Online (Sandbox Code Playgroud)

要么

obj.children().length;
Run Code Online (Sandbox Code Playgroud)

但我不能说

obj.children; // this doesn't work
Run Code Online (Sandbox Code Playgroud)

因为它会导致以下错误:

Caught Closure call with mismatched arguments: function 'length' NoSuchMethodError : method not found: 'length' Receiver: Closure: ([dynamic])
Run Code Online (Sandbox Code Playgroud)

Gan*_*ede 6

在Dart中,getters与访问对象属性无法区分,因此定义接受参数的getter是非法的(即使它是可选的).

你的getter不带参数,但是使用=>运算符,返回一个带有可选参数的匿名函数.所以,obj.children是一个功能; 因此该语句obj.children.length;是错误的,因为函数没有该属性length.

您可能无法省略括号,但如果get children不是getter函数,您的代码将更自然地工作:

getChildren([roll]) { // null is the default value implicitly
  if (roll == null || roll == 'any') return _children;
  else return _children_by_roll[roll];
}
Run Code Online (Sandbox Code Playgroud)

用作:

obj.getChildren().length;
Run Code Online (Sandbox Code Playgroud)

要么:

obj.getChildren(rollObject).length;
Run Code Online (Sandbox Code Playgroud)