在频道映射上未找到用于方法摄像机动画的实现

发布于 2025-02-01 15:17:32 字数 837 浏览 4 评论 0原文

无法工作

依赖版本= google_maps_flutter: ^2.1.6

实施代码

Future<void> _goToTheLake() async {
LatLng lat = LatLng(ctrl.getLat().value, ctrl.getLang().value);
print(lat);
final GoogleMapController controller = await _controller.future;
controller.animateCamera(
    CameraUpdate.newCameraPosition(
    CameraPosition(target: lat, zoom: 15.0)));
setState(() {});

}

E/flutter (15144): [ERROR:flutter/lib/ui/ui_dart_state.cc(198)] Unhandled Exception: MissingPluginException(No implementation found for method camera#animate on channel plugins.flutter.io/google_maps_0)
E/flutter (15144): #0      MethodChannel._invokeMethod (package:flutter/src/services/platform_channel.dart:165:7)
E/flutter (15144): <asynchronous suspension>

“扑波图近年”按钮 解决方案请发表评论。

The Flutter map recenter button not working

dependency version = google_maps_flutter: ^2.1.6

Implement code

Future<void> _goToTheLake() async {
LatLng lat = LatLng(ctrl.getLat().value, ctrl.getLang().value);
print(lat);
final GoogleMapController controller = await _controller.future;
controller.animateCamera(
    CameraUpdate.newCameraPosition(
    CameraPosition(target: lat, zoom: 15.0)));
setState(() {});

}

E/flutter (15144): [ERROR:flutter/lib/ui/ui_dart_state.cc(198)] Unhandled Exception: MissingPluginException(No implementation found for method camera#animate on channel plugins.flutter.io/google_maps_0)
E/flutter (15144): #0      MethodChannel._invokeMethod (package:flutter/src/services/platform_channel.dart:165:7)
E/flutter (15144): <asynchronous suspension>

enter image description here

if anyone has a solution please drop a comment.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

嘿嘿嘿 2025-02-08 15:17:32
  ///map controller
  Completer<GoogleMapController> mapController = Completer();

  ///create map controller
  void onMapCreated(GoogleMapController controller) {
    if(!mapController.isCompleted){
      mapController.complete(controller);
    }
  }

  @override
  void dispose() {
    mapController = Completer();
    super.dispose();
  }

这对我来说很好

  ///map controller
  Completer<GoogleMapController> mapController = Completer();

  ///create map controller
  void onMapCreated(GoogleMapController controller) {
    if(!mapController.isCompleted){
      mapController.complete(controller);
    }
  }

  @override
  void dispose() {
    mapController = Completer();
    super.dispose();
  }

here's works fine for me

转身以后 2025-02-08 15:17:32

希望这会有所帮助

  Completer<GoogleMapController> _controller = Completer();


    if(!freezeMap) {
      _controller.future.then((value) =>

          value.animateCamera(
              CameraUpdate.newLatLngZoom(
                  LatLng(loc.lat, loc.long), zoomLevel)));
    }

Hope this helps

  Completer<GoogleMapController> _controller = Completer();


    if(!freezeMap) {
      _controller.future.then((value) =>

          value.animateCamera(
              CameraUpdate.newLatLngZoom(
                  LatLng(loc.lat, loc.long), zoomLevel)));
    }
野鹿林 2025-02-08 15:17:32
dependency version = google_maps_flutter:

像这样留下您的依赖。如果仍然不起作用,请保存它
通过以下步骤:

在终端:

flutter clean

flutter pub get

flutter run
dependency version = google_maps_flutter:

Leave your dependency like this. Then save it if it's still not working
go through these steps:

In terminal:

flutter clean

flutter pub get

flutter run
庆幸我还是我 2025-02-08 15:17:32

它不完全在文档中,而是在示例

这解决了我们的问题。

    void main() {
      final GoogleMapsFlutterPlatform platform = GoogleMapsFlutterPlatform.instance;
      // Default to Hybrid Composition for the example.
      (platform as GoogleMapsFlutterAndroid).useAndroidViewSurface = true;
      initializeMapRenderer();
      runApp(const MaterialApp(home: MapsDemo()));
    }
    
    Completer<AndroidMapRenderer?>? _initializedRendererCompleter;
    
    /// Initializes map renderer to the `latest` renderer type.
    ///
    /// The renderer must be requested before creating GoogleMap instances,
    /// as the renderer can be initialized only once per application context.
    Future<AndroidMapRenderer?> initializeMapRenderer() async {
      if (_initializedRendererCompleter != null) {
        return _initializedRendererCompleter!.future;
      }
    
      final Completer<AndroidMapRenderer?> completer =
          Completer<AndroidMapRenderer?>();
      _initializedRendererCompleter = completer;
    
      WidgetsFlutterBinding.ensureInitialized();
    
      final GoogleMapsFlutterPlatform platform = GoogleMapsFlutterPlatform.instance;
      unawaited((platform as GoogleMapsFlutterAndroid)
          .initializeWithRenderer(AndroidMapRenderer.latest)
          .then((AndroidMapRenderer initializedRenderer) =>
              completer.complete(initializedRenderer)));
    
      return completer.future;
    }

It's not exactly in the docs but in the example

This fixed the problem for us.

    void main() {
      final GoogleMapsFlutterPlatform platform = GoogleMapsFlutterPlatform.instance;
      // Default to Hybrid Composition for the example.
      (platform as GoogleMapsFlutterAndroid).useAndroidViewSurface = true;
      initializeMapRenderer();
      runApp(const MaterialApp(home: MapsDemo()));
    }
    
    Completer<AndroidMapRenderer?>? _initializedRendererCompleter;
    
    /// Initializes map renderer to the `latest` renderer type.
    ///
    /// The renderer must be requested before creating GoogleMap instances,
    /// as the renderer can be initialized only once per application context.
    Future<AndroidMapRenderer?> initializeMapRenderer() async {
      if (_initializedRendererCompleter != null) {
        return _initializedRendererCompleter!.future;
      }
    
      final Completer<AndroidMapRenderer?> completer =
          Completer<AndroidMapRenderer?>();
      _initializedRendererCompleter = completer;
    
      WidgetsFlutterBinding.ensureInitialized();
    
      final GoogleMapsFlutterPlatform platform = GoogleMapsFlutterPlatform.instance;
      unawaited((platform as GoogleMapsFlutterAndroid)
          .initializeWithRenderer(AndroidMapRenderer.latest)
          .then((AndroidMapRenderer initializedRenderer) =>
              completer.complete(initializedRenderer)));
    
      return completer.future;
    }
趁微风不噪 2025-02-08 15:17:32

正如许多其他线程所说的那样,这个问题的答案是
mapController = ploteer();

但对于许多人,在void dispose()中都称其为不会解决您的问题。
如果您的googlemap(..) 内部的小部件(如果)在下面的示例

中,如果(loadSearch)? ShowearchViewWidget():Showmapswidget();

您需要调用mapController = ploteer();其中loadsearch = true

您可能已经了解了现在的工作原理。基本上,完成器完成后,当您调用等待_mapcontrollerComment.future;时,将始终尽快返回。不会等待googlemap(... onmapCreated())完成。当您将loadSearch设置为false时,需要等待googlemap(... onmapCreated())在调用动画之前。再次初始化mapcontroller时,当您将loadSearch设置为true时,将使等待_mapcontrollerCompleter.future;等待googlemap(... onmapCreated(... onmapCreated())正确完成。

The answer to this issue, as many other threads says is
mapController = Completer();

but for many of you calling it in void dispose() wont solve your issue.
if you have your GoogleMap(..) widget inside an if like in the below example

if(loadSearch)? showSearchViewWidget() : showMapsWidget();

you need to call mapController = Completer(); where you set loadSearch = true.

you may have understood how it works by now. its basically that the Completer once completed, will always return asap when you call await _mapControllerCompleter.future;. wont wait for GoogleMap(...onMapCreated()) to finish. when you set loadSearch to false, you need to wait for GoogleMap(...onMapCreated()) before calling animate. initializing mapController again when you set loadSearch to true, will make await _mapControllerCompleter.future; wait for GoogleMap(...onMapCreated()) to properly finish.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文