空集状态有什么意义呢?
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(() {})
看起来整洁又可靠。
根据 setState
的 implementation 部分,它将按顺序排列在下面。
- 断言。如果任何断言失败,抛出异常并停止。
- 执行回调函数 (
final dynamic result = fn() as dynamic;
)
- 请求框架重建(
_element.markNeedsBuild();
)
加上其他答案,有一处不同。
在未安装的 (mounted == false
) 小部件上调用 setState()
时,它将失败。这意味着任何包裹在 setState
回调中的东西都不会被调用,而如果你 运行 它在 setState
之外,它就会被执行。
我想知道在不为变量设置新值的情况下调用 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(() {})
看起来整洁又可靠。
根据 setState
的 implementation 部分,它将按顺序排列在下面。
- 断言。如果任何断言失败,抛出异常并停止。
- 执行回调函数 (
final dynamic result = fn() as dynamic;
) - 请求框架重建(
_element.markNeedsBuild();
)
加上其他答案,有一处不同。
在未安装的 (mounted == false
) 小部件上调用 setState()
时,它将失败。这意味着任何包裹在 setState
回调中的东西都不会被调用,而如果你 运行 它在 setState
之外,它就会被执行。