Flutter代码检查与分析插件cool_linter的使用
Flutter代码检查与分析插件cool_linter的使用
Cool linter
这是一个为Dart/Flutter代码定制的代码检查工具。它可以设置排除某些单词的规则,这些单词可以在analysis_options.yaml
中配置。
使用方法
1. 在pubspec.yaml
中添加依赖
dev_dependencies:
cool_linter: ^1.2.0 # 插件的最新版本
2. 在analysis_options.yaml
中添加配置
analyzer:
plugins:
- cool_linter
cool_linter:
extended_rules:
- always_specify_stream_subscription
- prefer_trailing_comma
always_specify_types:
- typed_literal
- declared_identifier
- set_or_map_literal
- simple_formal_parameter
- type_name
- variable_declaration_list
regexp_exclude:
-
pattern: Colors
hint: 使用设计系统中的颜色!
severity: WARNING
-
pattern: Test123{1}
severity: ERROR
exclude_folders:
- test/**
- lib/ku/**
规则说明
always_specify_types
检查器
这个规则类似于Dart核心的检查规则,但你可以选择使用哪些子规则:
typed_literal
declared_identifier
set_or_map_literal
simple_formal_parameter
type_name
variable_declaration_list
你还可以为这个规则选择排除的文件夹,参见exclude_folders
。
regexp_exclude
检查器
pattern
: 正则表达式模式,例如:Test123{1}
,^Test123$
等。severity
(可选): 控制台信息级别,可以是WARNING
,INFO
,ERROR
。默认是WARNING
。hint
(可选): 控制台信息提示。exclude_folders
: 这些文件夹将被忽略。默认排除的文件夹包括:'.dart_tool/**', '.vscode/**', 'packages/**', 'ios/**', 'macos/**', 'web/**', 'linux/**', 'windows/**', 'go/**',
extended_rules
检查器
always_specify_stream_subscription
: 总是使用StreamSubscription
来处理Stream.listen()
。
正确示例:
final Stream<String> stream2 = Stream<String>.value('value');
final StreamSubscription<String> sub = stream2.listen((_) {}); // OK
警告示例:
final Stream<String> stream1 = Stream<String>.value('value');
stream1.listen((String ttt) {}); // LINT
注意事项
必须重启IDE以启动插件。
命令行工具 (CLI)
你可以通过命令行工具使用linter:
dart bin/cool_linter_cli.dart analyze -tsc -d test/fix/result --regexp_path test/regexp/regexp_settings_cli.yaml
或者使用dart pub run
:
dart pub run cool_linter:analyze -tsc -d test/fix/result --regexp_path test/regexp/regexp_settings_cli.yaml
可用的自动修复功能:
prefer_trailing_comma
always_specify_types_rule
的子规则:declared_identifier
,simple_formal_parameter
,variable_declaration_list
命令行选项:
-d
: 要分析的文件夹-f
: 修复问题(目前仅支持prefer_trailing_comma
规则)-t
: 使用always_specify_types_rule
规则-s
: 使用always_specify_stream_subscription
规则-c
: 使用prefer_trailing_comma
规则--regexp_path
: 正则表达式设置文件的路径
结果示例
以下是analysis_options.yaml
的完整示例:
analyzer:
plugins:
- cool_linter
cool_linter:
extended_rules:
- always_specify_stream_subscription
- prefer_trailing_comma
always_specify_types:
- typed_literal
- declared_identifier
- set_or_map_literal
- simple_formal_parameter
- type_name
- variable_declaration_list
regexp_exclude:
-
pattern: Colors
hint: 使用设计系统中的颜色!
severity: WARNING
-
pattern: Test123{1}
severity: ERROR
exclude_folders:
- test/**
- lib/ku/**
示例图片
完整示例Demo
以下是一个完整的示例项目结构和代码,展示了如何使用cool_linter
进行代码检查和分析。
项目结构
my_flutter_app/
├── lib/
│ └── main.dart
├── test/
│ └── widget_test.dart
├── pubspec.yaml
└── analysis_options.yaml
pubspec.yaml
name: my_flutter_app
description: A new Flutter project.
publish_to: 'none' # Remove this line if you wish to publish to pub.dev
version: 1.0.0+1
environment:
sdk: ">=2.17.0 <3.0.0"
dependencies:
flutter:
sdk: flutter
dev_dependencies:
flutter_test:
sdk: flutter
flutter_lints: ^2.0.0
cool_linter: ^1.2.0 # 添加cool_linter依赖
analysis_options.yaml
analyzer:
plugins:
- cool_linter
cool_linter:
extended_rules:
- always_specify_stream_subscription
- prefer_trailing_comma
always_specify_types:
- typed_literal
- declared_identifier
- set_or_map_literal
- simple_formal_parameter
- type_name
- variable_declaration_list
regexp_exclude:
-
pattern: Colors
hint: 使用设计系统中的颜色!
severity: WARNING
-
pattern: Test123{1}
severity: ERROR
exclude_folders:
- test/**
- lib/ku/**
lib/main.dart
import 'package:flutter/material.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue, // 这里会触发警告,因为使用了Colors
),
home: MyHomePage(),
);
}
}
class MyHomePage extends StatefulWidget {
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
int _counter = 0;
void _incrementCounter() {
setState(() {
_counter++;
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Flutter Demo Home Page'),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text(
'You have pushed the button this many times:',
),
Text(
'$_counter',
style: Theme.of(context).textTheme.headline4,
),
],
),
),
floatingActionButton: FloatingActionButton(
onPressed: _incrementCounter,
tooltip: 'Increment',
child: Icon(Icons.add),
),
);
}
}
test/widget_test.dart
import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:my_flutter_app/main.dart';
void main() {
testWidgets('Counter increments smoke test', (WidgetTester tester) async {
// Build our app and trigger a frame.
await tester.pumpWidget(MyApp());
// Verify that our counter starts at 0.
expect(find.text('0'), findsOneWidget);
expect(find.text('1'), findsNothing);
// Tap the '+' icon and trigger a frame.
await tester.tap(find.byIcon(Icons.add));
await tester.pump();
// Verify that our counter has incremented.
expect(find.text('0'), findsNothing);
expect(find.text('1'), findsOneWidget);
});
}
更多关于Flutter代码检查与分析插件cool_linter的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
1 回复