Android と iOS で動作する天気アプリがあります。Android バージョンには、Home_widget および WorkManager プラグインを使用してバックグラウンドで更新するホーム画面ウィジェットがあり、iOS でも同じものを実装しようとしています。私は確かに専門家ではありませんが、ワーク マネージャーのコールバック プロセスが iOS で開始されると、dart アイソレートが作成されることを理解しています。これは、フラッターのメイン プロセスに登録されたプラグインが利用できないことを意味し、WorkmanagerPlugin の setPluginRegistrantCallback 関数を使用して、必要なプラグインをアイソレートに登録する必要があります。
ここに私の 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)
}
return super.application(application, didFinishLaunchingWithOptions: launchOptions)
}
}
行
GeneratedPluginRegistrant.register(with: registry)
はすべてのプラグインを登録する必要があり、登録します。
ただし、http プラグイン ( https://pub.dev/packages/http ) が必要ですが、メイン プロセスに登録されていないため、isolate に登録されません。次のようなものを使用して特定のプラグインを登録できることは知っていますが、http プラグインの完全なパッケージ名や、これが機能するかどうかはわかりません。
HomeWidgetPlugin.register(with: registry.registrar(forPlugin: "es.antonborri.home_widget.HomeWidgetPlugin") as! FlutterPluginRegistrar)
これは私の GeneratedPluginRegistrant.java で、http プラグインが登録されていないことを示しています。
public final class GeneratedPluginRegistrant {
public static void registerWith(@NonNull FlutterEngine flutterEngine) {
ShimPluginRegistry shimPluginRegistry = new ShimPluginRegistry(flutterEngine);
flutterEngine.getPlugins().add(new com.jrai.flutter_keyboard_visibility.FlutterKeyboardVisibilityPlugin());
com.aloisdeniel.geocoder.GeocoderPlugin.registerWith(shimPluginRegistry.registrarFor("com.aloisdeniel.geocoder.GeocoderPlugin"));
flutterEngine.getPlugins().add(new com.baseflow.geocoding.GeocodingPlugin());
com.ggichure.github.hexcolor.HexcolorPlugin.registerWith(shimPluginRegistry.registrarFor("com.ggichure.github.hexcolor.HexcolorPlugin"));
flutterEngine.getPlugins().add(new es.antonborri.home_widget.HomeWidgetPlugin());
flutterEngine.getPlugins().add(new com.lyokone.location.LocationPlugin());
flutterEngine.getPlugins().add(new dev.fluttercommunity.plus.packageinfo.PackageInfoPlugin());
flutterEngine.getPlugins().add(new io.flutter.plugins.pathprovider.PathProviderPlugin());
flutterEngine.getPlugins().add(new com.baseflow.permissionhandler.PermissionHandlerPlugin());
flutterEngine.getPlugins().add(new io.flutter.plugins.urllauncher.UrlLauncherPlugin());
flutterEngine.getPlugins().add(new io.flutter.plugins.videoplayer.VideoPlayerPlugin());
flutterEngine.getPlugins().add(new creativemaybeno.wakelock.WakelockPlugin());
flutterEngine.getPlugins().add(new io.flutter.plugins.webviewflutter.WebViewFlutterPlugin());
flutterEngine.getPlugins().add(new be.tramckrijte.workmanager.WorkmanagerPlugin());
}
}
長いリードアップですが、私の質問は、アイソレートでどのように http を使用するのですか?
(これにはいくつかの背景があります。次のエラーが表示されます:
Unhandled Exception: MissingPluginException(No implementation found for method registerBackgroundCallback on channel home_widget)
コードをステップ実行すると、API から http プラグインを使用してデータを取得しようとした行で、この例外が発生します。したがって、多くの掘り下げと読み取りを通じて、httpがIsolateに登録されていないことが原因だと思いますが、間違っている可能性があります?!)