空集状态有什么意义呢?

Empty set state what is the point?

我想知道在不为变量设置新值的情况下调用 setState 背后的意义。

  readLocal() async {
    prefs = await SharedPreferences.getInstance();
    id = prefs.getString('id') ?? '';
    if (id.hashCode <= peerId.hashCode) {
      groupChatId = '$id-$peerId';
    } else {
      groupChatId = '$peerId-$id';
    }

    setState(() {});
  }

文档说 [https://docs.flutter.io/flutter/widgets/State/setState.html]:

Calling setState notifies the framework that the internal state of this object has changed in a way that might impact the user interface in this subtree, which causes the framework to schedule a build for this State object.

空括号 { } 是空回调(因为你显然不需要):

The provided callback is immediately called synchronously. [...]

简而言之:

setState(() {});

是一种告诉框架重新构建状态对象的方法,无需使用传递将在构建后立即调用的回调的可能性

我会说这只是一个约定。上面可以重写为

readLocal() async {
  prefs = await SharedPreferences.getInstance();
  setState(() {
    id = prefs.getString('id') ?? '';
    if (id.hashCode <= peerId.hashCode) {
      groupChatId = '$id-$peerId';
    } else {
     groupChatId = '$peerId-$id';
   }
  });
}

两者都会做同样的事情。在改变 state variable 之后调用 setState(() {}) 看起来整洁又可靠。

根据 setStateimplementation 部分,它将按顺序排列在下面。

  1. 断言。如果任何断言失败,抛出异常并停止。
  2. 执行回调函数 (final dynamic result = fn() as dynamic;)
  3. 请求框架重建(_element.markNeedsBuild();)

加上其他答案,有一处不同。

在未安装的 (mounted == false) 小部件上调用 setState() 时,它将失败。这意味着任何包裹在 setState 回调中的东西都不会被调用,而如果你 运行 它在 setState 之外,它就会被执行。