这个问题的答案是我在pubspec中更改地理定位器版本.升级到7.0.0



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();
  });
}

更多信息可以在这里和这里找到。

相关内容

  • 没有找到相关文章

最新更新