用setState()包装整个函数和只包装实际更改之间有区别吗?
-
包装整个函数
setState(() { if (switchValueAdd) { valueAdd.text = (int.parse(num1) + int.parse(num2)).toString(); } else { valueAdd.text = ''; } });
-
只包含实际更改
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