flutter中的function()和()=>function()有什么区别?
What is the difference between function() and ()=> function() in flutter?
我遇到了“发生异常。
FlutterError(构建期间调用了 setState() 或 markNeedsBuild()。".
我用下面的代码解决问题:
@override
Widget build(BuildContext context) {
return GestureDetector(
//onTap: press(), error
onTap: () => press()
但我不知道为什么。
所以,我想知道flutter中的function()和()=> function()有什么区别?
onTap: () => press()
onTap: (){press();}
相同,但 (lambda)=> 用于一行代码,只是短语法
()=>函数和函数没有区别
但是调用函数的方式有所不同。
第一种方式是这样的:
onTap: Press,
反之:
onTap: () => Press();
好吧,如果您这样调用它们,您可以从函数中获取 {}:function();
如果你只调用名称,你可以从函数中得到 (){}:function
那么让我们来看看这些实际是如何工作的!
Dart 有正式的规范文档,您可以单击 here 查看它。 Dart 中的函数必须具有以下几个特性:
- return 类型(可选但推荐)
- 姓名(必填)
- 名字后面的括号(必需)
- 参数列表(可选)
- 大括号内的函数体或
=>
. 前的函数体单语句
你的问题是关于第 5 点的。 {}
和 =>
函数体的区别在于大括号允许您编写用 semi-colon ;
分隔的多个语句,而第二种方法应该只是一个语句,以单个 semi-colon ;
.
结尾
让我们看几个例子。这是一个简单的 log()
函数,允许您将任何 Object
实例记录到调试控制台:
import 'dart:developer' as devtools show log;
extension Log on Object {
void log() => devtools.log(toString());
}
请注意该函数如何具有 return 类型的 void
(第 1 点),名为 log
的名称(第 2 点),没有由 ()
表示的参数(第 3 点和第 4 点)和一个函数体,它是带有 =>
(第 5 点)的单个语句。
您可以使用大括号(第 5 点)而不是 =>
编写相同的函数,如下所示:
extension Log on Object {
void log() {
devtools.log(toString());
}
}
其结果将与之前的实现完全相同。
现在让我们看另一个例子,您的函数有一个 return 值和一些参数。
String fullName(String firstName, String lastName) {
return "$firstName $lastName";
}
因为这个函数只有一个语句,return
语句和一个 semi-colon,它可以像这样 re-written 作为箭头函数;
String fullName(
String firstName,
String lastName,
) =>
"$firstName $lastName";
所以我想说不成文的规则是:
如果您的函数主体易于理解,请使用 arrow-functions。你甚至可以在 arrow-function 的主体中包含多行代码,只要它可以理解,就可以使用。
如果您的函数体相当复杂,可能由多个 un-related 代码段组成,请将函数体与 curly-brackets 一起使用。
我遇到了“发生异常。 FlutterError(构建期间调用了 setState() 或 markNeedsBuild()。".
我用下面的代码解决问题:
@override
Widget build(BuildContext context) {
return GestureDetector(
//onTap: press(), error
onTap: () => press()
但我不知道为什么。
所以,我想知道flutter中的function()和()=> function()有什么区别?
onTap: () => press()
onTap: (){press();}
相同,但 (lambda)=> 用于一行代码,只是短语法
()=>函数和函数没有区别
但是调用函数的方式有所不同。
第一种方式是这样的:
onTap: Press,
反之:
onTap: () => Press();
好吧,如果您这样调用它们,您可以从函数中获取 {}:function();
如果你只调用名称,你可以从函数中得到 (){}:function
那么让我们来看看这些实际是如何工作的!
Dart 有正式的规范文档,您可以单击 here 查看它。 Dart 中的函数必须具有以下几个特性:
- return 类型(可选但推荐)
- 姓名(必填)
- 名字后面的括号(必需)
- 参数列表(可选)
- 大括号内的函数体或
=>
. 前的函数体单语句
你的问题是关于第 5 点的。 {}
和 =>
函数体的区别在于大括号允许您编写用 semi-colon ;
分隔的多个语句,而第二种方法应该只是一个语句,以单个 semi-colon ;
.
让我们看几个例子。这是一个简单的 log()
函数,允许您将任何 Object
实例记录到调试控制台:
import 'dart:developer' as devtools show log;
extension Log on Object {
void log() => devtools.log(toString());
}
请注意该函数如何具有 return 类型的 void
(第 1 点),名为 log
的名称(第 2 点),没有由 ()
表示的参数(第 3 点和第 4 点)和一个函数体,它是带有 =>
(第 5 点)的单个语句。
您可以使用大括号(第 5 点)而不是 =>
编写相同的函数,如下所示:
extension Log on Object {
void log() {
devtools.log(toString());
}
}
其结果将与之前的实现完全相同。
现在让我们看另一个例子,您的函数有一个 return 值和一些参数。
String fullName(String firstName, String lastName) {
return "$firstName $lastName";
}
因为这个函数只有一个语句,return
语句和一个 semi-colon,它可以像这样 re-written 作为箭头函数;
String fullName(
String firstName,
String lastName,
) =>
"$firstName $lastName";
所以我想说不成文的规则是:
如果您的函数主体易于理解,请使用 arrow-functions。你甚至可以在 arrow-function 的主体中包含多行代码,只要它可以理解,就可以使用。
如果您的函数体相当复杂,可能由多个 un-related 代码段组成,请将函数体与 curly-brackets 一起使用。