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

0yycz8jy  于 2022-12-19  发布在  Flutter
关注(0)|答案(3)|浏览(132)

用setState() Package 整个函数和只 Package 实际更改有什么区别吗?

  1. Package 整个函数
setState(() {
   if (switchValueAdd) {
     valueAdd.text = (int.parse(num1) + int.parse(num2)).toString();
   } else {
     valueAdd.text = '';
   }
 });

1.仅 Package 实际更改

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

以上两个代码片段在性能上有什么不同吗?如有帮助,将不胜感激!
另外,对于if-else语句,“else”是否与“if”占用同样多的内存?换句话说,“else”是否基本上与“if”相同,只是检查“else”是否为真?
提前感谢您的努力和时间!

efzxgjgh

efzxgjgh1#

setState只在一种情况下调用(从if或else调用,而不是同时从两者调用)。但是,如果您必须编写可读代码,请使用第一个变量,因为它更具可读性。And语句不是高性能操作。
您还可以简化精简:

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

u3r8eeie2#

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

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
x6h2sr28

x6h2sr283#

从功能上讲,将非异步代码放在setState内部或外部将导致非常接近的结果。您应该尽量避免在setState中使用大量代码块,因为这可能难以读取。
如果你看一下setState方法的源代码,它只是调用函数和做一些Assert,所以如果你对它做同样数量的调用,它应该没有任何明显的区别。理论上,如果你从闭包内部访问局部变量,它可能会稍微慢一点。因为这些变量(或者至少是对它们的引用)可能需要通过堆栈复制到函数中,但是将导致的实际开销将需要对用于各种平台的dart编译器有更全面理解的人来充分研究。
实际上,就实际的性能而言,这不太可能有什么影响,因为您的代码中可能还有其他优化,它们会导致比这大得多的性能差异。
此外,从setState documentation
通常建议setState方法只用于 Package 实际的状态更改,而不是 Package 可能与更改关联的任何计算。例如,这里构建函数使用的值递增,然后更改写入磁盘,但只有增量 Package 在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() : '';
 });

相关问题