Flutter疑问:为何SizedBox与Container热重载时hashCode表现不同?
Flutter Widget HashCode热重载差异问题解答
1. BuildSizedBoxWidget的hashCode热重载后不变,是不是同一实例的多次引用?
hashCode一致不一定100%代表是同一个实例,但基本可以确定这个Widget实例在热重载时没被重新创建。
Flutter热重载只会重新执行build方法,如果你的BuildSizedBoxWidget是在build外面定义的——比如作为类的静态成员、全局变量,或者在initState里初始化后一直复用——热重载时不会生成新实例,hashCode自然不变。
另外,如果这个Widget是用const修饰的常量Widget(比如const SizedBox(width: 100, height: 100)),Flutter会自动复用这类常量实例,哪怕你在build里每次写,指向的都是同一个对象,hashCode当然不会变。
2. BuildContainerWidget的hashCode每次热重载都变的原因
核心就是每次热重载触发build时,都生成了新的Container实例:
- 如果Container的构造参数里有非常量值——比如依赖State里的变量、动态计算出来的值,或者没加
const修饰——Flutter没法复用它的实例,每次build都会新建一个Container对象,hashCode肯定不一样。 - 另外,Container内部默认会创建Padding、Decoration这类子对象,要是这些子对象也是动态生成的,也会导致整个Container的hashCode跟着变。
一句话总结:Widget实例能被复用(常量、全局/静态复用)时,hashCode热重载后不变;每次build都新建实例的话,hashCode就会变。
内容的提问来源于stack exchange,提问作者moondog
相关产品推荐
相关产品推荐

