【问题标题】:Empty set state what is the point?空置状态有什么意义?
【发布时间】:2019-02-22 07:30:40
【问题描述】:

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

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

    setState(() {});
  }

【问题讨论】:

标签: flutter setstate


【解决方案1】:

除了其他答案之外,还有一个区别。

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

【讨论】:

    【解决方案2】:

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

    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();)

    【讨论】:

    【解决方案3】:

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

    调用 setState 会通知框架此对象的内部状态已发生更改,可能会影响此子树中的用户界面,这会导致框架为此 State 对象安排构建。

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

    提供的回调会立即同步调用。 [...]

    简而言之:

    setState(() {});
    

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

    【讨论】:

    • 风格指南(某处)说不要这样做,因为通过查看setState 关于为什么你应该清楚你正在调用它,如果事情得到重构使得这里不再需要代码,对应的setState调用也可以重构出来。
    • 我认为“在构建之后”部分是不正确的。它应该是“就在重建之前”。
    猜你喜欢
    • 2013-04-16
    • 2014-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-25
    • 1970-01-01
    • 1970-01-01
    • 2020-01-22
    相关资源
    最近更新 更多