Flutter后台调用shared_preferences出现MissingPluginException错误问询
问题原因
flutter_background_service: ^0.1.5 运行后台任务时会启动独立的Flutter引擎实例,默认不会自动注册第三方原生插件,因此后台isolate中调用shared_preferences相关方法时,找不到对应原生端实现,就会抛出MissingPluginException(No implementation found for method getAll on channel plugins.flutter.io/shared_preferences)异常,前台运行时使用的是主引擎,已完成所有插件注册所以运行正常。
解决方案
Dart层适配(优先尝试)
在后台服务的入口函数最开头完成初始化绑定即可:
// 后台服务入口必须加vm:entry-point注解避免被打包优化裁剪 @pragma('vm:entry-point') void onBackgroundStart(ServiceInstance service) async { // 新增下面两行代码 WidgetsFlutterBinding.ensureInitialized(); await SharedPreferences.getInstance(); // 后续写你的原有后台业务逻辑 }
注意:后台服务入口函数必须加@pragma('vm:entry-point')注解,否则会被Dart编译器在release打包时裁剪,导致后台服务无法启动
大部分场景下做完这一步即可解决问题。
原生层适配(Dart层不生效时使用)
Android端
找到安卓项目下app/src/main/kotlin/你的包名/MainApplication.kt文件,添加插件注册逻辑:
import io.flutter.app.FlutterApplication import io.flutter.embedding.engine.FlutterEngine import io.flutter.plugins.sharedpreferences.SharedPreferencesPlugin class MainApplication : FlutterApplication() { override fun onCreate() { super.onCreate() // 全局注册shared_preferences插件 FlutterEngine(this).plugins.add(SharedPreferencesPlugin()) } }
iOS端
找到iOS项目下Runner/AppDelegate.swift文件,添加注册逻辑:
import UIKit import Flutter import shared_preferences_ios @UIApplicationMain @objc class AppDelegate: FlutterAppDelegate { override func application( _ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? ) -> Bool { GeneratedPluginRegistrant.register(with: self.flutterEngine!) // 额外注册shared_preferences插件 FLTSharedPreferencesPlugin.register(with: self.flutterEngine!.binaryMessenger) return super.application(application, didFinishLaunchingWithOptions: launchOptions) } }
终极适配方案
如果以上步骤仍有问题,可升级依赖版本:
- 将
flutter_background_service升级到^2.4.6及以上版本,该版本之后默认已处理多引擎下插件自动注册逻辑 - 同步升级
shared_preferences到^2.2.2及以上版本,适配新版插件注册机制
升级后注意调整API调用适配新版依赖的变更即可。
内容的提问来源于stack exchange,提问作者Ahmed El-Shingiti
相关产品推荐
相关产品推荐

