You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 20:45:03