为何Flutter项目在Windows运行正常,在Ubuntu上创建Text、Button等组件必须加const?
问题产生原因
- 最常见诱因是两个环境的Flutter项目静态检查规则配置不一致。Windows侧的
analysis_options.yaml没有开启prefer_const_constructors的强制校验,或将该规则等级设为警告,仅提示不阻断编译;Ubuntu侧的配置将该规则等级设为错误,不符合要求的非const构造器代码无法通过编译校验。 - 两端Flutter SDK版本不一致也会触发该问题。更高版本的Flutter默认集成的
flutter_lints规则集更严格,默认将const构造器校验设为强制要求,若Ubuntu侧SDK版本高于Windows侧,就会出现Windows可运行、Ubuntu编译不通过的差异。 - 此外Ubuntu侧IDE的Flutter/Dart插件若开启了全局强制lint校验,会覆盖项目本地的规则配置,也会导致必须加const才能运行的问题。
对应解决办法
- 方案1:对齐两端项目检查规则。直接将Windows侧项目根目录的
analysis_options.yaml文件复制到Ubuntu侧同名项目根目录覆盖原有文件,之后执行flutter clean清理编译缓存,重新运行即可恢复正常。 - 方案2:手动修改Ubuntu侧的检查规则。若项目根目录存在
analysis_options.yaml,在linter.rules节点下添加如下配置:
linter: rules: # 直接关闭const构造器强制检查 prefer_const_constructors: false # 若仅需要降低等级为警告不阻断编译,替换为下方配置即可 # prefer_const_constructors: warning
若项目没有该配置文件,可以直接修改Flutter SDK全局规则:找到SDK安装路径下的packages/flutter_lints/lib/flutter.yaml,修改对应规则后可全局生效。
- 方案3:对齐两端Flutter SDK版本。分别在两个系统终端执行
flutter --version查看版本号,将版本较低的一端升级到和另一端一致即可消除版本带来的规则差异。 - 方案4:检查IDE插件配置。以VS Code为例,打开设置搜索
dart lint,确认全局强制lint选项处于关闭状态,设置优先使用项目内的analysis_options.yaml配置即可。
内容的提问来源于stack exchange,提问作者Alan Ichsan
相关产品推荐
相关产品推荐

