🟤

Flutter Analyzerを使ってコードの一貫性を保つ

2024/04/27に公開

Flutter Analyzerとは

Flutter Analyzerは、Flutterアプリケーションのコード品質を保証し、開発プロセスを支援するためのツール。
主な目的は

  • コードの静的解析:
    Flutter Analyzerは、文法的なエラーや型の不一致などを検出する。
    これによって、コードの品質を向上させ、ランタイムエラーのリスクを減少させることができる。

  • 慣習を守る:
    DartやFlutterのコーディング慣習を促進します。
    Analyzerは、慣習に従っていないコードを検出し、改善の提案を行うことができる。

  • コードの可読性と保守性の向上:
    コードの一貫性を保つことで、長期的なプロジェクトの可読性と保守性を向上させることができる。
    Analyzerは、不要なコードの削除、改善された命名規則の提案、リファクタリングの推奨などを通じて、これを支援する。

使ってみる

有名どころのIDE(AndroidStudioやVSCode)には、自動的に Flutter Analizer を適用しているので、コードを書いているときにリアルタイムでエラーや警告が出てくる。

Flutterに用意されたコマンドに analyzeというコマンドがあり、これを実行することでプロジェクトの全ファイルを静的解析して、エラーや警告などをリストアップすることができる。

とりあえず実行

$ flutter analyze

何かしら検出があった場合

今回の場合は、コンストラクタにconstをつけた方が良いよと教えてくれています。

Analyzing foo_bar_app...                                             

   info • Use 'const' with the constructor to improve performance • lib/main.dart:13:14 • prefer_const_constructors

1 issue found. (ran in 3.0s)

検出がない場合

Analyzing foo_bar_app...                                             
No issues found! (ran in 3.2s)

その他

解析ルールはカスタマイズ可能

Flutter Analyzerの解析ルールは予め決められたデフォルト設定があるが、それらは自由にカスタマイズ可能。

解析ルールは anlysis_options.yamlに追加で定義する。(初めは何もカスタイズ定義がない)

analyzer:

linter:
  rules:

ルールを追記

rulesに追加したいルールを追記します。
いろんなルールがあるので、Dart公式ドキュメントとかを漁れる。

今回はavoid_printというルールを追加してみる

analyzer:

linter:
  rules:
    - avoid_print

これでIDEやanalyzeコマンドで検出対象になってくれる。

検出時の種類をカスタマイズ

また、先ほどのprefer_const_constructorsの検出がデフォルトであったが、これをエラーとして検出したいなどのカスタマイズも可能で、以下のように書く。
そうすると検出時にエラーとして出力される。

analyzer:
  errors:
    prefer_const_constructors: error

linter:
  rules:

検出を無視したい時

特定のディレクトリに適用

excludeというキーを使う。
キーの配下に適用したいディレクトリのパスを指定する

analyzer:
  exclude:
    - lib/resouces/generated/**

linter:
  rules:

ルールごとに適用

逆に無視したいルールが出てきた場合は、以下のようにする

analyzer:
  errors:
    prefer_const_constructors: ignore

linter:
  rules:

特定のファイルや行に適用

実際の開発中だと、最終的にはこのルールを全体に適用したいけど、一時的に特定のファイルのコードだけ無視されてほしい(検出されてほしくない)時が頻発する
そんな時は、yamlファイルでの定義ではなく、検出されたくないファイルもしくは、特定の行に対して無視するようにマーキングできる。

特定のファイル全体に適用

ファイルの先頭に以下のように記載するだけ。

  // ignore_for_file: prefer_const_constructors

特定の行に適用

void main() {
  runApp(
    // ignore: prefer_const_constructors ←こんな感じ
    App(),
  );
}

こうすると本来App()のところでconst App()とした方が良いよという検出を無視することができる。

Discussion