Skip to content

Flutterで末尾カンマが自動削除される問題の解決法

問題の説明

Dart SDKバージョン3.7以降を使用している場合、以下の現象が発生します:

  • コード保存時(editor.formatOnSave: true設定時)に末尾カンマが自動削除される
  • Android StudioやVSCodeで同様の挙動が確認される
  • 従来のフォーマット動作(カンマを保持したままの整形)と異なる挙動となる

原因はDart 3.7で導入された新しいフォーマットルールです:

  • コレクションが1行に収まる場合、末尾カンマを自動削除
  • 複数行にわたる場合のみ末尾カンマを保持
  • 元のコードのカンマの有無に関わらず自動で決定される
dart
// フォーマット前
final list = [
  'item1',
  'item2', // この末尾カンマが削除される
];

// フォーマット後(1行に収まる場合)
final list = ['item1', 'item2'];

推奨解決策:末尾カンマを保持する設定

Dart 3.8以降では公式サポートされた設定が利用可能です。プロジェクトルートのanalysis_options.yamlに以下を追加:

yaml
formatter:
  trailing_commas: preserve

設定手順

  1. プロジェクトルートにanalysis_options.yamlファイルを作成(存在しない場合)
  2. 以下の内容を追加:
yaml
analyzer:
  # 既存のanalyzer設定が存在する場合はそのまま保持

formatter:
  trailing_commas: preserve  # この行を追加
  1. 変更を保存後、IDEを再起ート

動作確認

設定後は以下のようにカンマが保持されます:

dart
// フォーマット後もカンマが保持される
final list = [
  'item1',
  'item2', // カンマが残る
];

代替解決策と注意点

1. Dart SDKバージョンの調整(非推奨)

pubspec.yamlのSDK範囲を変更する方法もありますが、最新機能が使えなくなるため非推奨です:

yaml
environment:
  sdk: ">=3.6.0 <4.0.0"  # 3.7.0以上を除外

2. ページ幅設定の調整(不完全な解決)

ページ幅を指定することで一時的に改善する場合もありますが、根本解決にはなりません:

yaml
formatter:
  page_width: 80  # 任意の数値

注意事項

  • trailing_commas: preserveDart 3.8以降 でのみ有効
  • Flutterのバージョンが古い場合はアップグレードが必要:
    bash
    flutter upgrade
  • チーム開発時は全メンバーのDartバージョンを統一

背景と技術的根拠

この変更はDartスタイルガイドの公式提案に基づいています:

  • 複数行コレクションでは末尾カンマを追加(diffのクリーン化)
  • 単一行コレクションではカンマを削除(可読性向上)
  • フォーマッタが自動判断する仕様となった

設計思想としては「人間がカンマの有無を決めるのではなく、フォーマッタが一貫した判断をする」という方針転換によるものです。初期バージョンでは柔軟性に欠ける部分もありましたが、3.8以降では設定で従来の挙動を復元可能になりました。