代码之家  ›  专栏  ›  技术社区  ›  Tony Danilov

颤振中的SharedReferences错误

  •  6
  • Tony Danilov  · 技术社区  · 8 年前

    我在使用 shared_preferences 我的颤振应用程序中的插件。有一刻(可能是在颤振升级之后),它开始抛出一个异常:

    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)
    

    当我简单地尝试创建SharedReferences实例时,就会发生这种情况:

    SharedPreferences prefs = await SharedPreferences.getInstance();
    

    我试图找到问题的根源,但没能找到。谢谢你的帮助。

    编辑:我正在使用 shared_preferences: "^0.4.0"

    6 回复  |  直到 8 年前
        1
  •  7
  •   Tomerikoo Glorified    4 年前

    我使用以下解决方法解决了此问题:

    Future<SharedPreferences> prefs = SharedPreferences.getInstance();
    prefs.then(
      (pref)
      {
        //call functions like pref.getInt(), etc. here
      }
    );
    
        2
  •  6
  •   Tomerikoo Glorified    4 年前

    要对此进行调试,请使用以下命令:

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

    就我而言,错误是我想打电话 await SharedPreferences.getInstance() 在我打电话之前 runApp() ,因此错误消息给我的解决方案是按如下顺序排列代码:

    首先:

    WidgetsFlutterBinding.ensureInitialized();
    

    之后:

    SharedPreferences prefs = await SharedPreferences.getInstance();
    

    最后:

    runApp(...);
    
        3
  •  3
  •   John 0    8 年前

    我试过了 shared_preferences: "0.2.4" 以及上面建议的其他版本,但都没有成功。在将颤振通道从开发版更改为测试版后,终于实现了:

    flutter channel beta
    

    至少现在可以解决这个问题,只需等待dev频道上shared\u preferences插件的修复。

        4
  •  2
  •   Tomerikoo Glorified    4 年前

    我改成 shared_preferences: "0.3.3" 。这种情况很有可能再次发生。

        5
  •  0
  •   parth jansari    8 年前

    你需要像这样使用未来

    Future<SharedPreferences> _sprefs = SharedPreferences.getInstance();
    
        6
  •  0
  •   Tomerikoo Glorified    4 年前

    我一个接一个地删除包,发现它是由 flutter_barcode_scanner 。我将它升级到2.0.0版本,它解决了我的问题。