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 中放啥?