对于Flutter,只使用setState()包装实际更改是否更好?



用setState()包装整个函数和只包装实际更改之间有区别吗?

  1. 包装整个函数

    setState(() {
    if (switchValueAdd) {
    valueAdd.text = (int.parse(num1) + int.parse(num2)).toString();
    } else {
    valueAdd.text = '';
    }
    });
    
  2. 只包含实际更改

if (switchValueAdd) {
setState(() {
valueAdd.text = (int.parse(num1) + int.parse(num2)).toString();
});
} else {
setState(() {
valueAdd.text = '';
});
}

以上两个代码片段在性能方面有什么不同吗?任何帮助将不胜感激!

另外,使用if-else语句,'else'消耗的内存和'if'一样多吗?换句话说,"else"基本上与"if"相同,但检查是否为真?

提前感谢您的努力和时间!

从功能上讲,将非异步代码放在setState中或放在外部将会产生非常接近的结果。你应该尽量避免在setState中有一大块代码,因为这可能很难阅读。

如果您查看setState方法的源代码,它只是调用函数并做一些断言,所以如果您对它进行相同数量的调用,它应该没有任何明显的差异。从理论上讲,如果从闭包内访问局部变量,可能会稍微慢一些,因为这些变量(或者至少是对它们的引用)可能需要通过堆栈复制到函数中,但是实际的开销将导致需要对各种平台的dart编译器有更全面了解的人来充分研究。

实际上,就实际的实际性能而言,它不太可能有什么影响。在你的代码中可能有其他优化会导致比这更大的性能差异。

同样,从setState文档中:

通常建议setState方法只用于包装状态的实际更改,而不是任何可能与更改相关的计算。例如,这里构建函数使用的值是递增的,然后将更改写入磁盘,但是只有增量被封装在setState:

Future<void> _incrementCounter() async {
setState(() {
_counter++;
});
Directory directory = await getApplicationDocumentsDirectory();
final String dirName = directory.path;
await File('$dir/counter.txt').writeAsString('$_counter');
}

在这种情况下,我会更关注易读性——你觉得更容易阅读的版本可能是最适合你的。

我可能会这样写:

setState(() {
valueAdd.text =
switchValueAdd ? (int.parse(num1) + int.parse(num2)).toString() : '';
});

没有差别。setState只在一种情况下调用(从if或else调用,而不是从两者调用)。但是,如果您必须编写可读的代码,请使用第一个变体,因为它更具可读性。语句不是高性能的操作。

你也可以简化:

valueAdd.text = switchValueAdd
? (int.parse(num1) + int.parse(num2)).toString()
: valueAdd.text = '';

你可以在执行函数的所有代码后刷新状态,这样可以减少多次刷新构建,提高应用程序的性能。

valueAdd.text = switchValueAdd
? (int.parse(num1) + int.parse(num2)).toString()
: valueAdd.text = '';
/* All your other code which is need to manage state */
setState((){}); // call after all code executed of function

相关内容

最新更新