intl: DateFormat
LocaleDataException: Locale data has not been initialized, call initializeDateFormatting(<locale>).
上記のエラーが発生したら、以下を実行します。
import 'package:intl/date_symbol_data_local.dart'; // ここに注意
await initializeDateFormatting();
この呼び出しでは、date_symbol_data_local.dart
に定義されたシンボルデータを読み込みます。
もし、import先が、import 'package:intl/date_symbol_data_file.dart';
などと自動保管されていると、ローカルではなく、特定のファイルをからsymbol dataを読み込むメソッドになるので注意が必要です。
date_symbol_data_local.dart
のinitializeDateFormatting
は、2つの引数を無視しますので、特に気にせず呼び出します。
/// This should be called for at least one [locale] before any date
/// formatting methods are called. It sets up the lookup for date
/// symbols. Both the [locale] and [ignored] parameter are ignored, as
/// the data for all locales is directly available.
Future<void> initializeDateFormatting([String? locale, String? ignored]) {
DateFormatの表記はこちらに一覧がある。
await initializeDateFormatting()
main関数でこのメソッドを呼び出していることで、ある時から以下のエラーが発生してしまった。
Unsupported operation: Cannot set value in unmodifiable Map
これは、flutter_localizationsとのdata symbolの初期化が衝突しているからだった。
flutter_localizationsでも以下でintlのdata symbolを初期化している。
こちらのコメントにある通り、localizationsDelegates
を使っているときは、intlのinitializeDateFormatting()
呼び出しは必要ない。呼び出すことでエラーが発生する。
これは、flutter_localizations
の初期化処理が同時に発生する際にのみ起こるようで、flutter_localizationsの初期化後に、initializeDateFormatting()
を呼び出してもエラーにはならなかった。