我仍然是Dart的新手,语法=> (胖箭头)仍然让我困惑(我来自C#背景)。
所以在C#胖箭头(=>)中说:转到所以例如:
Action<string> action1 = (str) => { System.Diagnostic.Debug.WriteLine("Parameter received: " + str.ToString()); }
action1("Some parameter");
表示:无论是作为参数发送到action1
(如果它可以转换为string
),都会转到内部范围(在我们的例子中,它只是打印在{{1} }}
但在Dart中它有所不同....(?)
例如在Debug.WriteLine()
Future.then
Dart编辑警告我,第一个和第二个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"); }
);
是:print
。我认为在C#方式Expected string literal for map entry key
它只是为参数命名,该参数将由str
用于调用Future.then
或onValue
我做错了什么?
答案 0 :(得分:45)
您需要选择块语法或单个表达式语法,但不能同时选择两者。
你无法合并=&gt;与{}
使用您的示例,您的两个选项如下:
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"); }
);
在这两种情况下,它只是表达匿名函数的一种方式。
通常,如果您只想运行单个表达式,请使用=&gt;更清洁的语法和更多的点代码。例如:
someFunction.then( (String str) => print(str) );
或者您可以使用带花括号的块语法来执行更多工作或单个表达式。
someFunction.then( (String str) {
str = str + "Hello World";
print(str);
});
但你无法将它们组合起来,因为那时你正在制作2个函数创建语法并且它会中断。
希望这有帮助。
答案 1 :(得分:27)
在Dart中=> xxx
只是一种避免{ return xxx; }
的语法糖。因此,以下两个函数是等效的:
var a = (String s) => s;
var b = (String s) { return s; } ;
您还可以在方法定义上使用=>
:
String myFunc(String s) => s;
String myFunc(String s) {
return s;
}
答案 2 :(得分:0)
该语法在javascript和c#等语言中都很好用,它支持public void syllabusAttach(){
String selectSQL = "SELECT Image_Reg FROM "+getRegulation()+" WHERE SubjectCode="+getSubCode()+"";
ResultSet rs = null;
FileOutputStream fos = null;
Connection conn = null;
Statement stmt = null;
try {
conn = connect();
stmt = conn.createStatement();
rs = stmt.executeQuery(selectSQL);
// write binary stream into file
InputStream is =rs.getBinaryStream("Image_Reg");
File file = new File("syllabus_"+getRegulation()+".pdf");
OutputStream os = new FileOutputStream(file);
System.out.println("Writing BLOB to file " + file.getAbsolutePath());
byte[] content = new byte[1024];
int size = 0;
while((size = is.read(content)) !=-1){
os.write(content,0,size);
}
} catch (SQLException | IOException e) {
System.out.println(e.getMessage());
} finally {
try {
if (rs != null) {
rs.close();
}
if (stmt != null) {
stmt.close();
}
if (conn != null) {
conn.close();
}
if (fos != null) {
fos.close();
}
} catch (SQLException | IOException e) {
System.out.println(e.getMessage());
}
}
}
write binary stream into file
File file = new File("syllabus_"+getRegulation()+".pdf");
fos = new FileOutputStream(file);
System.out.println("Writing BLOB to file " + file.getAbsolutePath());
while (rs.next()) {
InputStream input = rs.getBinaryStream("Image_Reg");
byte[] buffer = new byte[1024];
while (input.read(buffer) > 0) {
fos.write(buffer);
}
}
且语句之间用半冒号分隔。在dart中,粗箭头仅支持表示(param1, param2, …, paramN) => { statements }
的缩写。
那解释了你的错误。带有花括号{ return expr; }
的代码表示您正在返回地图,因此它希望看到类似于(exp) => { print("Error occurred in class loading. Error is: $exp"); }
的内容,其中key是字符串文字。