iOS端Flutter Home Widget触发MissingPluginException异常问题咨询
问题原因梳理
首先纠正你的判断误区:
http包是纯Dart实现的网络库,不需要在原生侧做任何插件注册操作,你遇到的报错和http插件未注册完全无关。- 你拿到的
MissingPluginException报错指向home_widget的registerBackgroundCallback方法,本质是home_widget插件没有在WorkManager创建的后台Isolate中完成注册导致的。
解决步骤
1. 确认iOS端自动生成的插件注册逻辑
你贴出的是Android端的GeneratedPluginRegistrant.java代码,先检查iOS项目下ios/Runner/GeneratedPluginRegistrant.swift文件,确认是否包含home_widget的注册逻辑,正常会存在类似以下代码:
import home_widget // 其他插件导入省略 extension GeneratedPluginRegistrant { open class func register(with registry: FlutterPluginRegistry) { // 其他插件注册逻辑省略 HomeWidgetPlugin.register(with: registry.registrar(forPlugin: "HomeWidgetPlugin")!) } }
如果不存在对应逻辑,执行flutter clean后重新执行flutter pub get,重新生成注册文件即可。
2. 手动补全后台Isolate的插件注册
如果自动生成的注册逻辑在后台Isolate中仍不生效,可以在setPluginRegistrantCallback闭包中手动注册home_widget插件,修改你的AppDelegate代码如下:
import UIKit import Flutter import workmanager import home_widget @UIApplicationMain @objc class AppDelegate: FlutterAppDelegate { override func application( _ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? ) -> Bool { GeneratedPluginRegistrant.register(with: self) UIApplication.shared.setMinimumBackgroundFetchInterval(TimeInterval(60*15)) WorkmanagerPlugin.setPluginRegistrantCallback { registry in // 先执行自动注册逻辑 GeneratedPluginRegistrant.register(with: registry) // 手动补注册home_widget,确保后台Isolate可以调用其方法 HomeWidgetPlugin.register(with: registry.registrar(forPlugin: "es.antonborri.home_widget.HomeWidgetPlugin") as! FlutterPluginRegistrar) } return super.application(application, didFinishLaunchingWithOptions: launchOptions) } }
3. 调整Dart侧后台回调的执行顺序
在Dart层定义的WorkManager后台执行方法中,必须优先执行HomeWidget.registerBackgroundCallback()初始化,再执行http请求等业务逻辑,示例代码如下:
@pragma('vm:entry-point') void backgroundCallback() { Workmanager().executeTask((task, inputData) async { // 必须先初始化home_widget的后台回调 await HomeWidget.registerBackgroundCallback(); // 再执行http请求等业务逻辑 // final response = await get(Uri.parse('你的天气接口地址')); return true; }); }
注意后台回调方法必须加
@pragma('vm:entry-point')注解,防止Dart编译时被树摇丢弃。
http调用异常的排查方向
如果你确认http调用确实存在问题,按以下优先级排查:
- 检查iOS项目的
Info.plist是否添加了HTTP域名白名单,或者开启了NSAllowsArbitraryLoads权限 - 确认后台执行时已经拿到网络权限,可提前在主进程申请好后台网络权限
内容的提问来源于stack exchange,提问作者roly151
相关产品推荐
相关产品推荐

