Flutter代码检查与分析插件cool_linter的使用

发布于 1周前 作者 bupafengyu 来自 Flutter

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/**

示例图片

命令行结果 Linter结果1 Linter结果2 Linter结果3

完整示例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 回复

更多关于Flutter代码检查与分析插件cool_linter的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是如何在Flutter项目中集成并使用cool_linter(假设它是一个假设的Flutter代码检查与分析插件,因为实际上Flutter社区中广泛使用的类似工具是flutter_lints,但这里我们按照要求处理cool_linter)的指南,包括相关代码案例。

1. 添加依赖

首先,你需要在pubspec.yaml文件中添加cool_linter作为开发依赖。

dev_dependencies:
  flutter_test:
    sdk: flutter
  cool_linter: ^x.y.z  # 假设的版本号

确保替换^x.y.z为实际的版本号。

2. 获取依赖

在终端中运行以下命令以获取依赖:

flutter pub get

3. 配置分析选项

在项目的根目录下创建一个.dart-format文件(如果cool_linter有特定的格式要求)以及一个analysis_options.yaml文件来配置lint规则。以下是一个示例analysis_options.yaml配置:

include: package:cool_linter/analysis_options.yaml

# 你可以在这里添加或覆盖cool_linter的默认规则
linter:
  rules:
    # 示例:启用或禁用特定的lint规则
    avoid_empty_else: true
    avoid_redundant_argument_values: false

注意:实际的规则集和配置方式取决于cool_linter的实现细节。

4. 应用Lint规则

在配置完成后,你可以通过运行以下命令来分析你的代码:

flutter analyze

这个命令将会应用cool_linter中定义的lint规则,并报告任何违反这些规则的地方。

5. 集成到CI/CD管道

如果你使用GitLab CI、GitHub Actions或其他CI/CD工具,你可以将这些lint检查集成到你的构建管道中。以下是一个GitLab CI的示例配置:

stages:
  - test

lint:
  stage: test
  script:
    - flutter pub get
    - flutter analyze
  only:
    - main

这将确保在每次推送到main分支时都会运行lint检查。

6. 示例代码与修复

假设cool_linter报告了以下lint问题:

INFO: Avoid using unnecessary statements (avoid_unnecessary_statements at lib/main.dart:10)

这意味着在main.dart文件的第10行有一个不必要的语句。原始代码可能看起来像这样:

void main() {
  print('Hello, World!');
  ;  // 不必要的语句
  runApp(MyApp());
}

修复后的代码应该是:

void main() {
  print('Hello, World!');
  runApp(MyApp());
}

总结

以上是如何在Flutter项目中集成和使用假设的cool_linter插件的步骤。实际使用时,你需要参考cool_linter的具体文档来调整配置和规则。如果cool_linter不存在,你可能想要查看广泛使用的flutter_lints或其他类似的lint工具。

回到顶部