Flutter中ElevatedButton.styleFrom报常量表达式调用错误
问题解决:Method invocation is not a constant expression
错误原因
你的LoginPage类使用了const构造函数,这要求类中所有final实例变量必须是编译时常量。但ElevatedButton.styleFrom()是方法调用,属于运行时计算的值,不符合常量表达式的要求,因此触发报错。
解决办法
方法1:移除构造函数的const修饰符
直接去掉LoginPage构造函数的const,这样类的实例变量不再强制要求是编译时常量,方法调用初始化就可以正常工作:
import 'package:flutter/material.dart'; import 'package:samples/constants/constants.dart'; class LoginPage extends StatelessWidget { LoginPage() : super(); // 移除const修饰符 final ButtonStyle elevatedButtonStyle = ElevatedButton.styleFrom( onPrimary: Constants.jaffaOrange, primary: Constants.jaffaOrange, shape: const RoundedRectangleBorder( borderRadius: BorderRadius.all(Radius.circular(2)) ) ); @override Widget build(BuildContext context) { return Scaffold( body: Center( child: ElevatedButton( style: elevatedButtonStyle, onPressed: () { }, child: const Text('Login'), ), ), ); } }
方法2:用Getter方法定义样式(保留const构造)
如果需要保留const构造函数,可以把样式定义为Getter方法,每次调用时再创建实例,避免常量要求:
import 'package:flutter/material.dart'; import 'package:samples/constants/constants.dart'; class LoginPage extends StatelessWidget { const LoginPage() : super(); ButtonStyle get elevatedButtonStyle => ElevatedButton.styleFrom( onPrimary: Constants.jaffaOrange, primary: Constants.jaffaOrange, shape: const RoundedRectangleBorder( borderRadius: BorderRadius.all(Radius.circular(2)) ) ); @override Widget build(BuildContext context) { return Scaffold( body: Center( child: ElevatedButton( style: elevatedButtonStyle, onPressed: () { }, child: const Text('Login'), ), ), ); } }
补充说明
Dart中带有const构造函数的类,其实例是不可变的编译时常量,所有成员变量必须在编译阶段就能确定具体值。方法调用、动态计算等运行时操作都不符合常量表达式的要求,这是你遇到这个问题的核心原因。
内容的提问来源于stack exchange,提问作者FreakyAli
相关产品推荐
相关产品推荐

