E/flutter (29506): [ERROR:flutter/lib/ui/ui_dart_state.cc(177)] Unhandled Exception: Bad state: No element
E/flutter (29506): #0 List.first (dart:core-patch/growable_array.dart:250:5)
E/flutter (29506): #1 _MainScreenFullState._onLoad (package:follower/main/main_screen_full.dart:40:46)
E/flutter (29506): <asynchronous suspension>
E/flutter (29506): #2 _MainScreenFullState.initState.<anonymous closure> (package:follower/main/main_screen_full.dart:29:13)
E/flutter (29506): #3 new Future.delayed.<anonymous closure> (dart:async/future.dart:326:39)
E/flutter (29506): #4 _rootRun (dart:async/zone.dart:1182:47)
E/flutter (29506): #5 _CustomZone.run (dart:async/zone.dart:1093:19)
E/flutter (29506): #6 _CustomZone.runGuarded (dart:async/zone.dart:997:7)
E/flutter (29506): #7 _CustomZone.bindCallbackGuarded.<anonymous closure> (dart:async/zone.dart:1037:23)
E/flutter (29506): #8 _rootRun (dart:async/zone.dart:1190:13)
E/flutter (29506): #9 _CustomZone.run (dart:async/zone.dart:1093:19)
E/flutter (29506): #10 _CustomZone.bindCallback.<anonymous closure> (dart:async/zone.dart:1021:23)
E/flutter (29506): #11 Timer._createTimer.<anonymous closure> (dart:async-patch/timer_patch.dart:18:15)
E/flutter (29506): #12 _Timer._runTimers (dart:isolate-patch/timer_impl.dart:397:19)
E/flutter (29506): #13 _Timer._handleMessage (dart:isolate-patch/timer_impl.dart:428:5)
E/flutter (29506): #14 _RawReceivePortImpl._handleMessage (dart:isolate-patch/isolate_patch.dart:168:12)
E/flutter (29506):
아주 간단하지만 어이 없는 오류다..
위와 같은 오류가 떴는데 이유는
print('List=' + '${List.first['name']}');
print('List=' + '${List.first['color']}');
위의 프린트 문이 문제 였는데 프린트 문 안의 List.first['name'] 이 null 이 었기 때문.. 즉 널 처리를 해주면 된다.
print('List=' + '${List.first['name'] ?? null}');
print('List=' + '${List.first['color'] ?? null}');
혹은 인터넷을 뒤져 보니 아래와 같은 코드중에서 오류가 났다는 경우도 있었다.
@override
void initState() {
super.initState();
GetIt.I.get<SettingsLogic>().applyThemeFromPrefs();
}
// file: settings_logic.dart
void applyThemeFromPrefs() {
SharedPreferences.getInstance().then((prefs) {
var themeName = prefs.getString("theme");
_applyTheme(themeName);
});
}
void _applyTheme(String themeName) {
AppTheme appTheme = AppTheme.values.singleWhere((v) => describeEnum(v) == themeName);
_currentTheme = appTheme;
_streamController.sink.add(AppThemeChangedEvent(appTheme));
}
...
// listener to theme changing
class FxoApp extends StatelessWidget {
final SettingsLogic settings = GetIt.I.get<SettingsLogic>();
@override
Widget build(BuildContext context) {
return StreamBuilder<AppThemeChangedEvent>(
stream: settings.themeStream,
initialData: AppThemeChangedEvent(AppTheme.Light),
builder: (context, snapshot) {
return MaterialApp(
title: AppName,
theme: appThemeData[snapshot.data.appTheme],
...
위의 문제에서는
.firstWhere((a) => a == b, orElse:() => null) 로 똑같은 null 처리를 해주면 된다.