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

Android端google_maps_flutter插件报错:Bad state: Future already completed

解决google_maps_flutter中"Bad state: Future already completed"错误

问题重现

集成google_maps_flutter插件,已按要求配置minSdkVersion并在AndroidManifest.xml中添加API key,使用官方示例代码测试时,控制台持续抛出以下错误:

E/flutter (16699): [ERROR:flutter/runtime/dart_vm_initializer.cc(41)] Unhandled Exception: Bad state: Future already completed
E/flutter (16699): #0      _AsyncCompleter.complete (dart:async/future_impl.dart:35:31)
E/flutter (16699): #1      _GoogleMapState.onPlatformViewCreated
package:google_maps_flutter/src/google_map.dart:413
E/flutter (16699): <asynchronous suspension>
E/flutter (16699):

移除onMapCreated回调里的_controller.complete(controller)代码后,错误消失但地图无法正常显示。

原因分析

查看google_maps_flutter插件的源码_GoogleMapState.onPlatformViewCreated方法,发现该方法内部已经调用了_controller.complete(controller)完成Future。如果在自己的onMapCreated回调中再次调用_controller.complete(controller),就会导致同一个Completer被重复触发complete操作,从而抛出"Future already completed"的异常。

解决方案

不需要在onMapCreated中手动调用_controller.complete(controller),直接通过_controller.future获取地图控制器即可,同时确保GoogleMap组件配置了initialCameraPosition等必要参数,地图就能正常显示。

正确代码示例

import 'package:flutter/material.dart';
import 'package:google_maps_flutter/google_maps_flutter.dart';

class MapScreen extends StatefulWidget {
  const MapScreen({super.key});

  @override
  State<MapScreen> createState() => _MapScreenState();
}

class _MapScreenState extends State<MapScreen> {
  final Completer<GoogleMapController> _controller = Completer();
  static const CameraPosition _kGooglePlex = CameraPosition(
    target: LatLng(37.42796133580664, -122.085749655962),
    zoom: 14.4746,
  );

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: GoogleMap(
        mapType: MapType.normal,
        initialCameraPosition: _kGooglePlex,
        onMapCreated: (GoogleMapController controller) {
          // 这里无需调用_controller.complete(controller)
          // 可在此添加地图初始化逻辑,比如添加标记、设置地图样式等
          controller.addMarker(const MarkerOptions(
            position: LatLng(37.42796133580664, -122.085749655962),
            infoWindow: InfoWindow(title: 'Google Plex'),
          ));
        },
      ),
      floatingActionButton: FloatingActionButton.extended(
        onPressed: _goToTheLake,
        label: const Text('To the lake!'),
        icon: const Icon(Icons.directions_boat),
      ),
    );
  }

  Future<void> _goToTheLake() async {
    final GoogleMapController controller = await _controller.future;
    const CameraPosition _kLake = CameraPosition(
        bearing: 192.8334901395799,
        target: LatLng(37.43296265331129, -122.08832357078792),
        tilt: 59.440717697143555,
        zoom: 19.151926040649414);
    await controller.animateCamera(CameraUpdate.newCameraPosition(_kLake));
  }
}

说明

插件内部会在地图视图创建完成后自动完成Completer,我们只需要通过await _controller.future就能获取到地图控制器,进行后续的地图操作(比如移动相机、添加标记等)。onMapCreated回调仍然可以用来执行地图初始化的自定义逻辑,不会影响地图的正常加载。

内容的提问来源于stack exchange,提问作者Frost

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 11:55:20