Flutter中Container与Column为何不能使用const修饰?
首先得明确:这俩Widget不是完全不能加const,而是得满足Flutter对const Widget的核心要求——必须调用类的const构造函数,且所有传入的参数都是编译时常量(或者本身也是const Widget)。
具体到这两个Widget:
Container:它本身提供了const构造函数,如果你只传编译时常量参数,比如
const Container(width: 100, height: 100, color: Colors.red),这是完全合法的。但如果你的参数里包含非编译时常量(比如动态计算的宽高、非const的Decoration、或者引用了一个运行时才确定的变量),那const就加不了。比如你写const Container(decoration: BoxDecoration()),这里BoxDecoration如果没显式加const,就会报错——因为BoxDecoration的构造函数虽支持const,但默认调用的是普通构造,生成的不是const实例。Column:它继承自Flex,Flex有const构造函数。同样,当所有参数都是编译时常量时可以加const,比如
const Column(children: [const Text('hello'), const Text('world')])。但如果children里有非const的Widget,或者传入了运行时生成的子组件列表(比如从接口拉取的数据生成的子Widget),那整个Column就不能用const修饰。另外,像Column的mainAxisAlignment这类枚举参数本身就是编译时常量,不会影响const修饰。
总结一下:能不能加const,核心看整个Widget树的所有相关参数是不是都能在编译期确定,和Container、Column这两个Widget本身无关,只是它们的常用参数经常会包含运行时变量,才让很多人误以为它们不能加const。
内容的提问来源于stack exchange,提问作者Matthew Xie

