我不明白为什么Flutter对象是不可变的。我在Flutter文档中尝试过,但没有那么大帮助。如果有人能帮我,我会很感激的。
另外,我两天前才开始激动,这太棒了。
来源https://api.flutter.dev/flutter/widgets/StatefulWidget-class.html
StatefulWidget实例本身是不可变的,并存储它们可变状态在由createState方法,或在该State订阅的对象中,用于示例Stream或ChangeNotificationer对象,引用是存储在StatefulWidget本身的最终字段中。
每当框架对StatefulWidget进行充气时,它都会调用createState,这意味着多个State对象可能与相同的StatefulWidget,如果该小部件已插入多个地方。类似地,如果从树,然后再次插入到树中,框架将调用createState再次创建一个新的State对象,简化State对象的生命周期。
StatefulWidget在从一个如果其创建者将GlobalKey用于它的钥匙。因为带有GlobalKey的小部件最多可以在一个在树中的位置,使用GlobalKey的小部件最多有一个关联元素。框架利用了这一特性从树中的一个位置移动具有全局键的小部件时通过将与之相关的(唯一的)子树移植到另一个小部件从旧位置到新位置(而不是在新位置重新创建子树)。国家反对与StatefulWidget关联的子树,这意味着State对象被重用(而不是重新创建)。但是,为了有资格移植时,必须将小部件插入从旧位置删除的同一动画帧。
性能注意事项
主要有两类StatefulWidgets。
第一种是在State.initState和在State.dispose中处理它们,但这并不取决于InheritedWidgets或调用State.setState用于应用程序或页面的根,并与通过ChangeNotifiers、Streams或其他此类对象的子窗口小部件。遵循这种模式的有状态小部件相对便宜(CPU和GPU周期),因为它们是一次性构建的,然后永远不会使现代化因此,它们可能有一些复杂而深入的构建方法。
第二类是使用State.setState或依赖于继承的小工具。在应用程序的生命周期,因此将重建这样一个小部件的影响。(他们也可以使用State.initState或State.didChangeDependencies并分配资源,但重要的是他们要重建。)
"Flutter对象";相当宽泛。有不同种类的物体。
状态和小部件是分开的,它们有不同的生命周期。不可变性是出于性能原因而使用的。如果小部件需要更改,请创建一个相应设置的新实例。检查两个实例是否相同比检查它们的状态是否相同更快。
这也是经常使用const
的原因之一。它确保在构造函数参数相同的情况下使用相同的实例。
从链接到上述的文档
尽可能使用常量小部件。(这相当于缓存一个小部件并重新使用它。)
不可变性是许多编程语言的基石,使用不可变数据可以更有效地利用这一优势为每帧重建不可变视图树
一般来说,我们应该将重建托付给真正改变的子树
小部件树是用户界面的不可变描述。如果不从根源上重建,我们怎么能重建其中的一部分?事实上,小部件树并不是一个实体化的树结构,从父小部件到子小部件,从根到叶都有引用。特别是,StatelessWidget和StatefulWidget没有子引用。它们所提供的是构建方法(在有状态的情况下,通过关联的State实例)。Flutter框架递归地调用这些构建方法,同时生成或更新实际的运行时树结构,而不是小部件,而是引用小部件的Element实例。元素树是可变的,并由Flutter框架管理。
那么,当您在State实例s上调用setState时,实际会发生什么呢?Flutter框架标记根在对应于s的元素处的子树以进行重建。当下一帧到期时,该子树将根据s的构建方法返回的小部件树进行更新,这反过来又取决于当前应用程序状态