これについては、こちらで説明しています。最も重要な部分は次のとおりです。
クロージャーを作成するたびに、そのクロージャーは新しいオブジェクトになります。
これを回避するために、オブジェクトを変数に格納できます。トップレベルの関数と静的メソッドは期待どおりに機能します。
void main() {
var foo = new Foo();
if (foo.someMethod == foo.someMethod)
print("foo.someMethod == foo.someMethod");
else
print("foo.someMethod != foo.someMethod");
var storedMethodClosure = foo.someMethod;
if (storedMethodClosure == storedMethodClosure)
print("storedMethodClosure == storedMethodClosure");
else
print("storedMethodClosure != storedMethodClosure");
if (someFunction == someFunction)
print("someFunction == someFunction");
else
print("someFunction != someFunction");
if (Foo.staticMethod == Foo.staticMethod)
print("Foo.staticMethod == Foo.staticMethod");
else
print("Foo.staticMethod != Foo.staticMethod");
}
void someFunction() {
}
class Foo {
someMethod() {
}
static staticMethod() {
}
}
これは以下を出力します:
foo.someMethod != foo.someMethod
storedMethodClosure == storedMethodClosure
someFunction == someFunction
Foo.staticMethod == Foo.staticMethod