はじめに
Flutter 2.5.0以降で新規プロジェクトを作るとデフォでflutter_lintsが導入されています。
こういうやつです。
include: package:flutter_lints/flutter.yaml
逆に言うとそれより前に作られたプロジェクトはlints系パッケージが導入されていない場合があります。
今回はそういった際にlints系パッケージを導入するための小ネタ記事です。
lints系パッケージを選ぶ
自分が知っているパッケージをいくつか挙げます。まずは以下から選ぶのが良いのではないかと思います🙆♂️
flutter_lints
flutter_lintsは公式がFlutter用に推奨しているlintルールをまとめたパッケージです。
実装を見ると分かるように公式のDart推奨ルールをまとめたlintsパッケージのrecommended.yamlにflutter用ルールを追加しています。
# 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
lintsパッケージは特に重要なルールをまとめたcore.yamlと、core.yamlに推奨ルールを足したrecommended.yamlを提供しています。
flutter_lints ⊃ recommended ⊃ core
という関係ですね。
pedantic_mono
pedantic_monoはmonoさんが公開しているflutter_lintsを更に厳しくしたパッケージです。
全部貼ると長いので一部ですが、flutter_lintsをincludeしてルールを追加していますね👀
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
~~~
pedantic_mono ⊃ flutter_lints ⊃ recommended ⊃ core
って感じですね。
余談
知り合いがpedantic_monoをペダモノって略してたんですが一般的なんですかね🤔
very_good_analysis
very_good_analysisはVGVが公開しているパッケージです。
僕は使ったこと無いのですが有名企業が公開しているので利用者は多いかと思います。
過去バージョンのyamlが残っているので、バージョン固定がしやすそうです。
ルールを適用していく
本編です。
パッケージの追加
どのパッケージもだいたい同じです。
pubspec.yamlのdev_dependenciesにパッケージを追加します。
dev_dependencies:
flutter_lints: ^{バージョン}
analysis_options.yamlでincludeします。
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で表示されたコマンドでルールごとに修正できます。
dart fix --apply --code=prefer_single_quotes
わかりやすいように以下のようにincludeをコメントアウトしながら進めることもできます。(コマンド実行するルールの追記を忘れず)
# include: package:flutter_lints/flutter.yaml
# 対応完了したrule、最後に消す
linter:
rules:
- prefer_single_quotes
dart fix --apply --code={ルール}の余談
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を入れたいですね🥳
まとめ
正直この知識が役立つ日が来ないほうが良い😇