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,因为它将调用所有的构建方法。对于不经常更改的数据,我通常使用根继承的小部件,然后在下面使用多个具有选择性数据的继承小部件