Flutter疑问:为何无法使用final成员变量作为Widget的padding参数?
为什么Flutter中无法用final成员变量作为EdgeInsets.all()的参数?
嘿,我来帮你拆解这个问题~ 你遇到的编译报错,核心原因和Dart里const关键字的规则有关,咱们一步步说:
问题根源
你代码里写了const EdgeInsets.all(padding),这里的const要求括号里的参数必须是编译时常量——意思是这个值在程序编译的时候就得完全确定,不能等到运行时才赋值。
而你定义的final double padding是Bottombar类的实例成员变量,它的值是在外部创建Bottombar实例的时候才传进来的(比如Bottombar(padding: 10.0)),这个值是运行时确定的,不属于编译时常量范畴,所以编译器会报错说“padding参数必须为常量表达式”。
解决办法
针对你的场景(需要外部动态传入padding值),最简单的解决方式就是去掉EdgeInsets.all()前面的const关键字:
class Bottombar extends StatelessWidget { final double padding; Bottombar({@required this.padding}); @override Widget build(BuildContext context) { return Container( padding: EdgeInsets.all(padding), // 去掉const,允许使用运行时变量 child: const Text('Test'), // 这里Text的内容是固定常量,加const没问题 ); } }
如果非要用const(其实这里完全没必要,因为padding是动态变化的),那只能把padding改成编译期静态常量,但这样就没法外部传值了,示例代码如下:
class Bottombar extends StatelessWidget { static const double padding = 16.0; // 编译时就确定的常量 Bottombar(); @override Widget build(BuildContext context) { return Container( padding: const EdgeInsets.all(padding), // 现在符合const要求了 child: const Text('Test'), ); } }
另外提一句,你用的Flutter beta 0.3.1版本虽然比较老旧,但这个Dart的const规则是语言层面的基础规则,不管新版本还是旧版本都得遵守哦。
内容的提问来源于stack exchange,提问作者mianlaoshu
相关产品推荐
相关产品推荐

