You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 01:05:54