【小ネタ】荒廃したFlutterプロジェクトにlint系パッケージを導入する手順

## はじめに
Flutter 2.5.0以降で新規プロジェクトを作るとデフォで[flutter_lints](https://pub.dev/packages/flutter_lints)が導入されています。
こういうやつです。
```yaml:analysis_options.yaml
include: package:flutter_lints/flutter.yaml
```
逆に言うとそれより前に作られたプロジェクトはlints系パッケージが導入されていない場合があります。
今回はそういった際にlints系パッケージを導入するための小ネタ記事です。

## lints系パッケージを選ぶ
自分が知っているパッケージをいくつか挙げます。まずは以下から選ぶのが良いのではないかと思います🙆‍♂️

### flutter_lints
[flutter_lints](https://pub.dev/packages/flutter_lints)は公式がFlutter用に推奨しているlintルールをまとめたパッケージです。
実装を見ると分かるように公式のDart推奨ルールをまとめた[lintsパッケージ](https://pub.dev/packages/lints)のrecommended.yamlにflutter用ルールを追加しています。
```yaml:flutter_lints/lib/flutter.yaml
# Recommended lints for Flutter apps, packages, and plugins.

include: package:lints/recommended.yaml

linter:
  rules:
    - avoid_print
    - avoid_unnecessary_containers
    - avoid_web_libraries_in_flutter
    - no_logic_in_create_state
    - prefer_const_constructors
    - prefer_const_constructors_in_immutables
    - prefer_const_declarations
    - prefer_const_literals_to_create_immutables
    - sized_box_for_whitespace
    - sort_child_properties_last
    - use_build_context_synchronously
    - use_full_hex_values_for_flutter_colors
    - use_key_in_widget_constructors
```

https://github.com/flutter/packages/blob/main/packages/flutter_lints/lib/flutter.yaml

[lintsパッケージ](https://pub.dev/packages/lints)は特に重要なルールをまとめたcore.yamlと、core.yamlに推奨ルールを足したrecommended.yamlを提供しています。

flutter_lints　⊃　recommended　⊃　core
という関係ですね。

### pedantic_mono
[pedantic_mono](https://pub.dev/packages/pedantic_mono)はmonoさんが公開しているflutter_lintsを更に厳しくしたパッケージです。
全部貼ると長いので一部ですが、flutter_lintsをincludeしてルールを追加していますね👀
```yaml:pedantic_mono/lib/analysis_options.yaml
include: package:flutter_lints/flutter.yaml
analyzer:
  errors:
    missing_required_param: warning
    missing_return: warning
  language:
    strict-casts: true
    strict-inference: true
    strict-raw-types: true
linter:
  rules:
    - always_declare_return_types
    - always_put_control_body_on_new_line
    - avoid_bool_literals_in_conditional_expressions
~~~
```

https://github.com/mono0926/pedantic_mono/blob/main/lib/analysis_options.yaml

pedantic_mono　⊃ flutter_lints　⊃　recommended　⊃　core
って感じですね。

#### 余談
知り合いがpedantic_monoをペダモノって略してたんですが一般的なんですかね🤔

### very_good_analysis
[very_good_analysis](https://pub.dev/packages/very_good_analysis)はVGVが公開しているパッケージです。
僕は使ったこと無いのですが有名企業が公開しているので利用者は多いかと思います。
過去バージョンのyamlが残っているので、バージョン固定がしやすそうです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2542067/88abfbf4-7c79-f323-354e-7112400d195a.png)

## ルールを適用していく
本編です。

### パッケージの追加
どのパッケージもだいたい同じです。
pubspec.yamlのdev_dependenciesにパッケージを追加します。
```yaml:pubspec.yaml
dev_dependencies:
  flutter_lints: ^{バージョン}
```

analysis_options.yamlでincludeします。
```yaml:analysis_options.yaml
include: package:flutter_lints/flutter.yaml
```
この段階で場合によっては数千の警告がでて😇となります。

### dart fixコマンドを使う
dart fixコマンドが警告の解消に役立ちます。
dart fix --applyを使うことでfix可能な警告をまとめて消せますが、今回のようなケースだと修正の正しさを確認しきれないので微妙です。
まずはdart fix --dry-runを使いましょう。
そうすると最後の方に修正可能なルールに対し、各ルールを修正するコマンドが表示されるのでメモしておきましょう。
```
To fix an individual diagnostic, run one of:
  dart fix --apply --code=avoid_redundant_argument_values 
  dart fix --apply --code=avoid_returning_null_for_void 
  dart fix --apply --code=avoid_unused_constructor_parameters 
  dart fix --apply --code=avoid_void_async 
  dart fix --apply --code=cast_nullable_to_non_nullable 
  dart fix --apply --code=curly_braces_in_flow_control_structures 
  dart fix --apply --code=dangling_library_doc_comments 
~~~
```

### ルールごとに修正
lints系パッケージを導入するときは可能ならルールごと（もしくはファイルごとなど）の小さな粒度で修正するのが良いと思います。

#### dart fix --applyで直るルールを修正
先程dart fix --dry-runで表示されたコマンドでルールごとに修正できます。
```zsh:ターミナル
dart fix --apply --code=prefer_single_quotes 
```
わかりやすいように以下のようにincludeをコメントアウトしながら進めることもできます。（コマンド実行するルールの追記を忘れず）
```yaml:analysis_options.yaml
# include: package:flutter_lints/flutter.yaml

# 対応完了したrule、最後に消す
linter:
  rules:
    - prefer_single_quotes
```

#### dart fix --apply --code=｛ルール｝の余談
[dart fixのドキュメント](https://dart.dev/tools/dart-fix)で特に触れられてなくて知らなかったのですが、Flutter 2.19.0から--codeで特定のルールに対してfixできるようになってたらしいです。
https://github.com/dart-lang/sdk/commit/f4ea96ff2cc00b5c73a35da34c04c118f3ebc435

また現状はanalysis.yamlに導入しているルールにしかfixが反応しませんが、それを改善するIssueもあるみたいです。
https://github.com/dart-lang/sdk/issues/49815


#### それ以外のルールを修正
dart fixコマンドで直せないルールはルールのページを見つつ気合で直しましょう。

### CI
lintルールが適用できたらGithub Actionsなどでanalyzeのworkflowを入れたいですね🥳

## まとめ
正直この知識が役立つ日が来ないほうが良い😇