Never give up

Flutter - Locale data has not been initialized 본문

해왔던 삽질..

Flutter - Locale data has not been initialized

대기만성 개발자 2021. 1. 18. 17:38
반응형

DateFormat을 사용할 때 해당 에러가 뜨는경우가 있습니다

 

안뜨는 경우도 있는데 정확하게 어떤 상황에서 뜨는지는 잘 모르겠습니다만

 

필자는 Easy Localization이라는 패키지를 사용할 때 나타났고

 

추측을 해보자면 Locale에 따른 DateFormat이 바뀌어야되는데

 

Locale이 초기화가 안돼서 나타난것으로 예측되고

 

해당 에러 또한 비슷한 내용을 암시합니다

 

LocaleDataException: Locale data has not been initialized, call initializeDateFormatting(<locale>).

 

해석해보면 Locale데이터가 초기화되지 않았으니 initializeDateFormatting()을 콜 해주세요

 

윗부분에 대해서 조금 더 얘기해보자면

 

Locale이 en-US로 되어있을 때에는 year / month / date를 사용할것이고

 

ko-KR이 되어있을 때에는 년 / 월 / 일 로 표기가 되어야되는데

 

Locale이 초기화가 안된상태(null인 상태)에서 어떤것으로 할지 몰라서 나는 에러 인거 같고

 

DateFormat메소드를 확인해보면 다음과 같이 적혀있습니다

 

/// If [locale] does not exist in our set of supported locales then an
/// [ArgumentError] is thrown.

 

간단하게 축약해보자면 locale값이 없으면 AurgmentError를 날려줍니다

 

(사실 이건 설계자체 에러이긴 합니다 default로 값을 영어로 출력하게 하면 되는데 굳이 error를 던지는거니까요)

 

< 잘 하자? >

해결방법으로는 초기화를 해주면 되는데

import 'package:intl/date_symbol_data_local.dart';

/*중략*/

@override
  void didChangeDependencies() {
    super.didChangeDependencies();
    initializeDateFormatting(Localizations.localeOf(context).languageCode);
  }
  
//혹은
  @override
  void initState() {
    super.initState();
    
    //비동기처리
    
    initializeDateFormatting(Localizations.localeOf(context).languageCode);
  }

 

languageCode를 context로부터 불러와서 DateFormat을 초기화 해줍니다

(디바이스의 locale값에 따라 변경됩니다)

 

그래서 평소와는 다르게 initState에서 콜하지 않았는데 initState에서 비동기 처리하는 과정에서

 

super.initState() 보다 초기화 메소드가 먼저 불리게 되면 다음과 같은 에러가 발생 수 있습니다

 

dependOnInheritedWidgetOfExactType<_LocalizationsScope>() or dependOnInheritedElement() was called before _SplashState.initState() completed.

 

간단하게 축약해보자면 initState가 완료되기전에 해당 메소드가 콜되었습니다

 

그래서 didChangeDependencies에서 콜하였고 확실하게 super.initState()가 먼저 완료되는 구조라면

 

initState에서 콜해도 무방합니다

 

요번에는 시간을 날리지는 않았지만 깊은 깨달음을 얻었습니다

 

< 깨달았다 >

다른 사람의 소스코드를 사용할 때 삽질시간을 줄일려면 조금 더 주의하면서 사용해야될거 같습니다

반응형
Comments