Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Performance 全局变量的最佳实践和性能_Performance_Flutter_Dart - Fatal编程技术网

Performance 全局变量的最佳实践和性能

Performance 全局变量的最佳实践和性能,performance,flutter,dart,Performance,Flutter,Dart,我需要存储一些数据,这些数据应该在我的应用程序中随处可见。到目前为止,我知道三种方法: 创建一个特殊文件以使变量为全局() 使用共享首选项(这里我只想访问数据,不一定要永远存储数据) 和继承的widget 我想知道哪种解决方案(或另一种我不知道的解决方案)在性能和易于实施方面是最好的。一个InheritedWidget可能是最好和更干净的方法,因为: 它为您提供了确定变量范围的优势(我知道,您需要全局变量,所以现在这不是您所关心的) 在某些情况下,您可以通过updateShouldNoti

我需要存储一些数据,这些数据应该在我的应用程序中随处可见。到目前为止,我知道三种方法:

  • 创建一个特殊文件以使变量为全局()
  • 使用共享首选项(这里我只想访问数据,不一定要永远存储数据)
  • 和继承的widget

我想知道哪种解决方案(或另一种我不知道的解决方案)在性能和易于实施方面是最好的。

一个
InheritedWidget
可能是最好和更干净的方法,因为:

  • 它为您提供了确定变量范围的优势(我知道,您需要全局变量,所以现在这不是您所关心的)
  • 在某些情况下,您可以通过
    updateShouldNotify
    重新生成它。重建
    InheritedWidget
    时,将重建引用其属性的所有小部件
  • 它比全局变量更干净,因为您对它们有更多的控制,并且还可以实现一些利用一些私有变量的“全局”方法。毕竟,这还是一门课
  • 由于flift索引了继承的widget实现,访问具有
    O(1)
    复杂性,允许通过
    上下文
    通过
    AnceStorInheriteElementForWidgeToFexactType
    方法进行有效访问
这就是说,
SharedReferences
是一个很大的禁忌,因为您需要进行大量的磁盘I/O操作,这比在RAM中操作的性能要差得多。此外,您还需要大量样板文件来管理变量的临时性质

至于全局变量,我认为它们没有给您提供与
InheritedWidget
相同的灵活性,而且我认为它们不是一个好的实践

谈到
InheritedWidget
,对于“动态”的东西,您可能不会简单地使用它,因为它的变量应该是不可变的(类被标记为
不可变的
,所以您的所有成员都应该是最终的)

一个干净的方法来解决这一问题是很好的解释。基本上,
AppState
是您的全局变量

EDIT正如@Rémi Rousselet所指出的,AncestorInheritatedElementForWidgeToFexactType
具有
O(1)
复杂性,因为查找是在
HashMap
上执行的,在最好的情况下具有
O(1)
复杂性,在最坏的情况下具有
O(n)


这仍然是一种有效的方法,因为它不会遍历整个小部件树来查找它。

一个
继承的小部件可能是最好和更干净的方法,因为:

  • 它为您提供了确定变量范围的优势(我知道,您需要全局变量,所以现在这不是您所关心的)
  • 在某些情况下,您可以通过
    updateShouldNotify
    重新生成它。重建
    InheritedWidget
    时,将重建引用其属性的所有小部件
  • 它比全局变量更干净,因为您对它们有更多的控制,并且还可以实现一些利用一些私有变量的“全局”方法。毕竟,这还是一门课
  • 由于flift索引了继承的widget
实现,访问具有
O(1)
复杂性,允许通过
上下文
通过
AnceStorInheriteElementForWidgeToFexactType
方法进行有效访问 这就是说,
SharedReferences
是一个很大的禁忌,因为您需要进行大量的磁盘I/O操作,这比在RAM中操作的性能要差得多。此外,您还需要大量样板文件来管理变量的临时性质

至于全局变量,我认为它们没有给您提供与
InheritedWidget
相同的灵活性,而且我认为它们不是一个好的实践

谈到
InheritedWidget
,对于“动态”的东西,您可能不会简单地使用它,因为它的变量应该是不可变的(类被标记为
不可变的
,所以您的所有成员都应该是最终的)

一个干净的方法来解决这一问题是很好的解释。基本上,
AppState
是您的全局变量

EDIT正如@Rémi Rousselet所指出的,AncestorInheritatedElementForWidgeToFexactType
具有
O(1)
复杂性,因为查找是在
HashMap
上执行的,在最好的情况下具有
O(1)
复杂性,在最坏的情况下具有
O(n)


这仍然是一种有效的方法,因为它不会遍历整个小部件树来查找它。

O(1)对于InheritedWidgets来说是一个谎言。它不会遍历小部件树,但仍会查看哈希映射。但是,是的,我会一直把InheritedWidgets置于全局之上。是的,你是对的,O(1)是最好的情况。我会编辑的,谢谢!InheritedWidget对于全局状态来说非常棒,但是,不建议通过任何方式使用唯一的InheritedWidget,因为它将调用所有的构建方法。对于不经常更改的数据,我通常使用根继承的小部件,下面我使用多个具有选择性数据的继承小部件。对于继承的小部件,O(1)是一个谎言。它不会遍历小部件树,但仍会查看哈希映射。但是,是的,我会一直把InheritedWidgets置于全局之上。是的,你是对的,O(1)是最好的情况。我会编辑的,谢谢!InheritedWidget对于全局状态来说非常棒,但是,不建议通过任何方式使用唯一的InheritedWidget,因为它将调用所有的构建方法。对于不经常更改的数据,我通常使用根继承的小部件,然后在下面使用多个具有选择性数据的继承小部件