【问题标题】: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 中一个工作示例的linksetState 方法的 documentation 声明

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

还有……

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

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

【问题讨论】:

标签: flutter dart statefulwidget


【解决方案1】:

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

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

例如

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

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


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

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

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

【讨论】:

    猜你喜欢
    • 2018-08-17
    • 2015-08-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多