更新到 flutter 2.5 后,默认代码中添加了 const 修饰符,并且有些地方不需要添加 const。那么添加 const 有什么区别呢?
import 'package:flutter/material.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({Key? key}) : super(key: key);
// This widget is the root of your application.
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: const HomePage(),
);
}
}
在任何使用静态数据的数据类型或小部件上使用 const 关键字是一个很好的做法。
但是,如果您想删除它,您可以编辑analysis_options.yaml 文件并添加以下内容:
open analysis_option.yaml file & under linter > rules disable
> prefer_const_constructor.
>
> linter:
> rules:
> prefer_const_constructors: false
然后,在设置prefer const constructors: false后,您需要在IDE终端中运行如下命令:
‘飞镖修复’
如果你看到这样的日志=> **
“此工具查找并修复与相关的分析问题 自动修复。”
** 那么试试这个
'dart fix --dry-run'
'dart fix --apply'
这是
flutter_lint
,它在 flutter 中默认使用。从 Flutter 版本 2.3.0 开始,使用 flutter create
创建的 Flutter 应用程序、包和插件已设置为使用此包中定义的 lint。
禁用个别规则
include: package:lints/recommended.yaml
linter:
rules:
avoid_shadowing_type_parameters: false
await_only_futures: true
有关更多信息,请阅读此分析选项
当您创建一个小部件,并且能够在其前面加上
const
前缀时,该小部件将不会重建。框架知道不要重建此类小部件,因为它可以知道对象没有更改。常量对象在编译时解析,并且由于称为规范化的过程,如果两个或多个对象具有相同的参数并且是常量,它们将引用同一个实例(它们是同一个)。
例如,如果您有
@override
Widget build() {
const MyWidget();
}
然后在您调用
setState
的地方,MyWidget
将不会被重建,因为它已经在编译时解析,并且框架也不会调用其 build
方法,这是有意义的,因为没有参数传递给 MyWidget
(此处没有)由于发布重建而发生了变化,因此配置仍然相同。
此外,如果您在其他地方调用
cosnt MyWidget();
,您仍然会引用相同的对象/实例,因此它是更优化的。
底线是,如果您能够以
const
为前缀,那么您绝对应该这样做。他们添加了 lint 规则,以便人们添加 cosnt
构造函数,并能够使用 cosnt
调用他们的小部件/类并利用上面提到的东西。
只需在
analysis_options.yaml
中禁用以下规则
rules:
prefer_const_constructors: false
prefer_const_constructors_in_immutables: false
prefer_const_literals_to_create_immutables: false