如何解决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中工作示例的link。
setState
方法的documentation指出
提供的回调将立即被同步调用。
和...
调用setState会通知框架此对象的内部状态已更改,该方式可能会影响此子树中的用户界面,这会导致框架为该State对象安排构建。
根据此定义,我认为没有理由在调用setState
方法之前不更改状态变量,然后为setState
提供空回调。是否在某些情况下这种方法行不通或只是或多或少地只是“品味”(可读性,简洁的编码...)?
解决方法
您绝对正确。我不知道确切原因是什么,但我会尽力解释我的想法。
setState
目前有一个作用。它确保您同步更新状态。 See Implementation
例如
Future.delayed(Duration(seconds: 3),(){
// Updated State variables
});
setState((){});
此代码可能不起作用,因为在变量更改之前将重新构建小部件。
我并不是说您不能异步更改状态,也不是说仔细的编码是行不通的。对于初学者来说,这只是初步检查。
我认为Flutter一直采用这种方法来更好地应对框架变更带来的风险。现在可能不需要回调,但是在将来,框架可能需要包括某些需要这种方法的功能。
无论是什么真正原因,只有Flutter团队才能知道。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。