在使用flutter的shared_preferences进行存储的时候,发现无法使用,看了下堆栈的错误信息是
错误信息
[ERROR:flutter/lib/ui/ui_dart_state.cc(157)] Unhandled Exception: MissingPluginException(No implementation found for method getAll on channel plugins.flutter.io/shared_preferences)
网上的办法:
一、
clean,杀进程等,均无效
二、
有一种可以存储的方法,在调用sp之前,调用以下方法
SharedPreferences.setMockInitialValues({});
经测试,可以使用sp的功能,但是每次启动都会清除缓存,并且注释也说了只是用于测试mock数据的。 所以不推荐使用
问题所在:
在探寻过程中,尝试用别人封装的mmvk库去代替sp,发现也出现一样的异常,怀疑是plugin加载没有成功导致。 最后发现我们的flutter初始化使用的是
FlutterFragment flutterFragment = FlutterFragment.withNewEngine().initialRoute("xxx").build();
使用缓存初始化的方式代替后,发现plugin的功能就正常了。
FlutterFragment flutterFragment = FlutterFragment.withCachedEngine("xxx").build();
但是这个时候会有一个问题,每次打开flutter的activity,都会被记录状态。
解决办法:
每次新建Engine,这样会丧失缓存功能,但是实际上和withNewEngine()是一个效果。 所以最后初始化部分代码为:
FlutterEngine flutterEngine = new FlutterEngine(this);
flutterEngine.getNavigationChannel().setInitialRoute("xxx");
flutterEngine.getDartExecutor().executeDartEntrypoint(DartExecutor.DartEntrypoint.createDefault());
FlutterEngineCache.getInstance().put("xxx", flutterEngine);
FlutterMethodHandler.registerWith(flutterEngine);
MyBasicMessageChannel.init(flutterEngine);
至此,sp可用,且打开的页面是新页面。 其中原理尚未细究,有大神知道的可以说一下