私はまだDartにかなり慣れていないので、=>(太い矢印)の構文はまだ混乱しています(C#の背景から来ています)。
したがって、C#の太い矢印(=>)は次のように言います:goes toしたがって、例:
_Action<string> action1 = (str) => { System.Diagnostic.Debug.WriteLine("Parameter received: " + str.ToString()); }
action1("Some parameter");
_
意味:パラメータとして_action1
_に送信するもの(string
にキャストできる場合)は内部スコープ(in私たちの場合はDebug.WriteLine()
に出力されます
しかし、ダートではそれは何か別のものです...(?)
たとえば_Future.then
_
_ClassWithFutures myClass = new ClassWithFutures();
myClass.loadedFuture.then(
(str) => { print("Class was loaded with info: $str"),
onError: (exp) => { print("Error occurred in class loading. Error is: $exp"); }
);
_
Dartエディターは、最初と2番目のprint
が_Expected string literal for map entry key
_であることを警告します。 C#の方法では、str
は_Future.then
_がonValue
またはonError
を呼び出すために使用する内部コールバックによって入力されるパラメーターの名前にすぎないと思います
私は何を間違っていますか?
ブロック構文または単一式構文のいずれかを選択する必要がありますが、両方を選択する必要はありません。
=>と{}を組み合わせることはできません
例を使用すると、2つのオプションは次のとおりです。
ClassWithFutures myClass = new ClassWithFutures();
myClass.loadedFuture.then(
(str) => print("Class was loaded with info: $str"),
onErrro: (exp) => print("Error occurred in class loading. Error is: $exp")
);
または
ClassWithFutures myClass = new ClassWithFutures();
myClass.loadedFuture.then(
(str) { print("Class was loaded with info: $str"); },
onErrro: (exp) { print("Error occurred in class loading. Error is: $exp"); }
);
どちらの場合も、それは無名関数を表現する方法にすぎません。
通常、単一の式を実行するだけの場合は、ポイントコードをより明確にするために=>構文を使用します。例:
someFunction.then( (String str) => print(str) );
または、中かっこ付きのブロック構文を使用して、より多くの作業を行うか、単一の式を使用できます。
someFunction.then( (String str) {
str = str + "Hello World";
print(str);
});
ただし、2つの関数作成構文を作成しているため、それらを組み合わせることはできません。
お役に立てれば。
Dartでは、=> xxx
は{ return xxx; }
を回避するための単なるシンタックスシュガーです。したがって、次の2つの関数は同等です。
var a = (String s) => s;
var b = (String s) { return s; } ;
メソッド定義で=>
を使用することもできます。
String myFunc(String s) => s;
String myFunc(String s) {
return s;
}
その構文は、JavaScriptのような言語や、#がセミコロンで区切られた(param1, param2, …, paramN) => { statements }
をサポートするc#でもうまく機能します。 Dartでは、太い矢印は{ return expr; }
の省略表現である式のみをサポートします。
それがあなたのエラーを説明しています。中括弧(exp) => { print("Error occurred in class loading. Error is: $exp"); }
を含むコードは、マップを返すことを意味するため、(param) => {"key": "value"}
のようなものが表示されることが期待されます。ここで、keyは文字列リテラルです。