E/flutter (13537): [ERROR:flutter/lib/ui/ui_dart_state.cc(209)]未处理异常:MissingPluginException(未发现通道flutter.baseflow.com/geolocator上isLocationServiceEnabled方法的实现)E/flutter (13537): #0 MethodChannel。_invokeMethod(包:颤振/src/服务/platform_channel.dart: 154:7)E/颤振(13537):E/flutter (13537): #1 _gettinglocationState。_determinePosition(包:flutter_app/main.dart: 34:22)E/颤振(13537):E/颤振(13537):
我假设你在试图从后台任务或隔离中获取当前位置时得到此错误。
这样做的问题是,在geolocator_android
的3.1.6版本和geolocator_apple
的2.1.2版本(iOS和macOS)中,默认的方法通道实现已被特定于平台的实现所取代。但是,由于任务是在没有Flutter引擎的单独隔离中运行的,因此平台特定实现(在本例中为geolocator_android
)未与平台接口(geolocator_platform_interface
)注册,从而导致MissingPluginException
。
要使用geolocator_android版本3.1.6+或geolocator_apple版本2.1.2+
(这些是geolocator_8.0.0版本的依赖项),请确保在后台任务启动时注册平台特定的实现。关于如何使用Workmanager
完成此任务的示例如下:
void callbackDispatcher() {
Workmanager().executeTask((task, inputData) async {
if (defaultTargetPlatform == TargetPlatform.android) {
GeolocatorAndroid.registerWith();
} else if (defaultTargetPlatform == TargetPlatform.iOS || defaultTargetPlatform == TargetPlatform.macOS) {
GeolocatorApple.registerWith();
} else if (defaultTargetPlatform == TargetPlatform.linux) {
GeolocatorLinux.registerWith();
}
await Geolocator.checkPermission();
await Geolocator.getCurrentPosition();
});
}
或者,如果您正在运行Flutter 2.11+,您可以使用新的DartPluginRegistrant.ensureInitialized()
方法来确保所有包都正确注册:
void callbackDispatcher() {
Workmanager().executeTask((task, inputData) async {
DartPluginRegistrant.ensureInitialized();
await Geolocator.checkPermission();
await Geolocator.getCurrentPosition();
});
}
更多信息可以在这里和这里找到。