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 中的函数必须具有以下几个特性:

  1. return 类型(可选但推荐)
  2. 姓名(必填)
  3. 名字后面的括号(必需)
  4. 参数列表(可选)
  5. 大括号内的函数体或=>.
  6. 前的函数体单语句

你的问题是关于第 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";

所以我想说不成文的规则是:

  1. 如果您的函数主体易于理解,请使用 arrow-functions。你甚至可以在 arrow-function 的主体中包含多行代码,只要它可以理解,就可以使用。

  2. 如果您的函数体相当复杂,可能由多个 un-related 代码段组成,请将函数体与 curly-brackets 一起使用。