일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- uint8array
- Prism.js
- web track
- FirebaseAnalytics
- swagger-typescript-api
- Raycasting
- Three js
- Completer
- methodChannel
- code editor
- Game js
- Babel standalone
- jszip
- Three-fiber
- webrtc
- babel
- node
- androidId
- typescript
- uint16array
- identifierForVender
- userevent_tracker
- Excel
- Redux
- RouteObserver
- Image Resize typescript
- react
- KakaoMap
- REST API
- Flutter
- Today
- Total
Never give up
Flutter - Locale data has not been initialized 본문
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에서 콜해도 무방합니다
요번에는 시간을 날리지는 않았지만 깊은 깨달음을 얻었습니다
다른 사람의 소스코드를 사용할 때 삽질시간을 줄일려면 조금 더 주의하면서 사용해야될거 같습니다
'해왔던 삽질..' 카테고리의 다른 글
Flutter - audio plugin test (0) | 2021.02.14 |
---|---|
Flutter - Execution failed for task ':app:lintVitalRelease' (0) | 2021.01.21 |
Flutter - Looking up a deactivated widget's ancestor is unsafe. (0) | 2020.12.26 |
Flutter - Call by reference (0) | 2020.12.13 |
Flutter - Loading hud (0) | 2020.12.12 |