Flutter:状态类:为啥不在 setState 方法调用之前改变状态变量,而不是在 setState 方法中

Posted

技术标签:

【中文标题】Flutter:状态类:为啥不在 setState 方法调用之前改变状态变量,而不是在 setState 方法中【英文标题】:Flutter: State class: Why not change a state variable before the setState method is called, rather than in the setState methodFlutter:状态类:为什么不在 setState 方法调用之前改变状态变量,而不是在 setState 方法中 【发布时间】:2020-10-09 06:46:19 【问题描述】:

举例说明问题: 如果您创建一个新的 Flutter 项目,您将获得默认的计数器应用程序,其中 _counter 变量在 State 类的 setState 方法中递增:

    class _MyHomePageState extends State<MyHomePage> 
     int _counter = 0;

     void _incrementCounter() 
      setState(() 
       _counter++;
       );
     
     ....

但下面的代码也可以正常工作:

class _MyHomePageState extends State<MyHomePage> 
 int _counter = 0;

 void _incrementCounter() 
   _counter++;
    setState(() );
 
 ....

这是 DartPad 中一个工作示例的link。 setState 方法的 documentation 声明

提供的回调立即同步调用。

还有……

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

根据这个定义,我认为没有理由在调用setState 方法之前不更改状态变量,然后向setState 提供一个空回调。是否存在这种方法不起作用的情况,或者它或多或少“只是”一个品味问题(可读性、干净的编码......)?

【问题讨论】:

看看这个 - ***.com/a/63433969/13840864 【参考方案1】:

你完全正确。我不知道确切的原因是什么,但我会尽力解释我的想法。

setState 目前有一个目的。它确保您同步更新您的状态。 See Implementation

例如

Future.delayed(Duration(seconds: 3), ()
  // Updated State variables
);
setState(());

此代码可能不起作用,因为小部件将在变量更改之前重建。


我并不是说您不能异步更改状态,也不是说仔细编码不起作用。这只是对初学者的初步检查。

我认为 Flutter 保留这种方法是为了更好地应对框架变化带来的风险。现在可能不需要回调,但在未来,框架可能需要包含某些需要这种方法的功能。

真正的原因是什么,只有 Flutter 团队才能知道。

【讨论】:

以上是关于Flutter:状态类:为啥不在 setState 方法调用之前改变状态变量,而不是在 setState 方法中的主要内容,如果未能解决你的问题,请参考以下文章

为啥在类构造函数中使用 setState 方法时 React 会抛出错误?

Flutter从源码分析setState 的时候到底发生了什么?

Flutter 有状态的代码问题。在 setstate 中放啥?

Flutter - setState 不更新内部有状态小部件

Flutter通知另一个页面刷新状态(EventBus)

Flutter通知另一个页面刷新状态(EventBus)