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

问题描述

通过示例指定问题: 如果创建新的Flutter项目,则会获得认的反应用程序,其中_counter类的setState方法中的State变量将递增:

    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中工作示例的linksetState方法documentation指出

提供的回调将立即被同步调用

和...

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

根据此定义,我认为没有理由在调用setState方法之前不更改状态变量,然后为setState提供空回调。是否在某些情况下这种方法行不通或只是或多或少地只是“品味”(可读性,简洁的编码...)?

解决方法

您绝对正确。我不知道确切原因是什么,但我会尽力解释我的想法。

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

例如

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

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


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

我认为Flutter一直采用这种方法来更好地应对框架变更带来的风险。现在可能不需要回调,但是在将来,框架可能需要包括某些需要这种方法的功能。

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