7

I was using shared_preferences plugin in my Flutter application. From one moment (probably after Flutter upgrade), it started to throw an exception:

E/flutter (27778): [ERROR:topaz/lib/tonic/logging/dart_error.cc(16)] Unhandled exception:
E/flutter (27778): type '_InternalLinkedHashMap' is not a subtype of type 'Map<String, Object>' where
E/flutter (27778):   _InternalLinkedHashMap is from dart:collection
E/flutter (27778):   Map is from dart:core
E/flutter (27778):   String is from dart:core
E/flutter (27778):   Object is from dart:core
E/flutter (27778): 
E/flutter (27778): #0      SharedPreferences.getInstance (package:shared_preferences/shared_preferences.dart)
E/flutter (27778): <asynchronous suspension>
E/flutter (27778): #1      loadFirstUse (**path**/lib/main.dart:29:53)
E/flutter (27778): <asynchronous suspension>
E/flutter (27778): #2      main (**path**/lib/main.dart:17:9)
E/flutter (27778): <asynchronous suspension>
E/flutter (27778): #3      _startIsolate.<anonymous closure> (dart:isolate/runtime/libisolate_patch.dart:279:19)
E/flutter (27778): #4      _RawReceivePortImpl._handleMessage (dart:isolate/runtime/libisolate_patch.dart:165:12)

It happens when I simple try to create instance of SharedPreferences:

SharedPreferences prefs = await SharedPreferences.getInstance();

I was trying to find root of the problem, but was unable to find it. Thank you for any help.

EDIT: I am using shared_preferences: "^0.4.0"

Tony Danilov
  • 430
  • 3
  • 11
  • 22

6 Answers6

7

I solved this using the following workaround:

Future<SharedPreferences> prefs = SharedPreferences.getInstance();
prefs.then(
  (pref)
  {
    //call functions like pref.getInt(), etc. here
  }
);
Tomerikoo
  • 18,379
  • 16
  • 47
  • 61
Roy
  • 105
  • 1
  • 10
6

To debug this, use the following:

Future<SharedPreferences> _sprefs = SharedPreferences.getInstance();
_sprefs.then((prefs) {
  // ...
}, 
onError: (error) {
  print("SharedPreferences ERROR = $error");   
});

In my case the error was that I wanted to call await SharedPreferences.getInstance() before I called runApp(), so that solution the error message gave me was to order my code as follows:

First:

WidgetsFlutterBinding.ensureInitialized();

Afterwards:

SharedPreferences prefs = await SharedPreferences.getInstance();

Finally:

runApp(...);
Tomerikoo
  • 18,379
  • 16
  • 47
  • 61
Haidar Hammoud
  • 83
  • 3
  • 12
3

I've tried shared_preferences: "0.2.4" and other versions suggested above without any success. Finally got it to work after changing flutter channel from dev to beta:

flutter channel beta

At least this fixes this problem for now and just wait for a fix for the shared_preferences plugin on the dev channel.

John 0
  • 46
  • 1
  • I tried this but get the message `git: Already on 'beta'` and I am already using `0.2.4` Still get the same error. – A.W. Jun 13 '18 at 13:00
2

I fixed it by changing to shared_preferences: "0.3.3". There is a good chance this breaks again.

Tomerikoo
  • 18,379
  • 16
  • 47
  • 61
oreid
  • 1,336
  • 2
  • 13
  • 25
  • I still get the same error after changing to `0.3.3` – A.W. Jun 13 '18 at 13:00
  • @Guus, yeah, not exactly sure why the fix worked for us. We ended up switching our entire state management to Redux. If you want to continue using shared_preferences, maybe try some other version numbers to see if they fix the issue. Sorry I can't give you a better answer. – oreid Jun 15 '18 at 02:35
0

you need to use Future like this

Future<SharedPreferences> _sprefs = SharedPreferences.getInstance();
parth jansari
  • 138
  • 1
  • 6
0

I remove packages one by one, and found that it was caused by flutter_barcode_scanner. I upgraded it to version 2.0.0 and it solved my problem.

Tomerikoo
  • 18,379
  • 16
  • 47
  • 61
s k
  • 4,342
  • 3
  • 42
  • 61