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
設定手順
- プロジェクトルートに
analysis_options.yaml
ファイルを作成(存在しない場合) - 以下の内容を追加:
yaml
analyzer:
# 既存のanalyzer設定が存在する場合はそのまま保持
formatter:
trailing_commas: preserve # この行を追加
- 変更を保存後、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: preserve
は Dart 3.8以降 でのみ有効- Flutterのバージョンが古い場合はアップグレードが必要:bash
flutter upgrade
- チーム開発時は全メンバーのDartバージョンを統一
背景と技術的根拠
この変更はDartスタイルガイドの公式提案に基づいています:
- 複数行コレクションでは末尾カンマを追加(diffのクリーン化)
- 単一行コレクションではカンマを削除(可読性向上)
- フォーマッタが自動判断する仕様となった
設計思想としては「人間がカンマの有無を決めるのではなく、フォーマッタが一貫した判断をする」という方針転換によるものです。初期バージョンでは柔軟性に欠ける部分もありましたが、3.8以降では設定で従来の挙動を復元可能になりました。