[bug] Flutter Android MissingPluginException

574 阅读1分钟

在使用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可用,且打开的页面是新页面。 其中原理尚未细究,有大神知道的可以说一下

此案例主要提供一种思路,具体遇到问题解决办法还要根据自己项目的实际情况进行分析