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 처리를 해주면 된다.

+ Recent posts