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

Flutter Google Maps在Android真机运行异常问题求助

Android真机Google Maps组件运行异常解决方法

问题描述

开发了全局复用的有状态组件GoogleMapWidget,用于显示带标记的地图,iOS模拟器运行正常,但三星S10真机执行flutter run时出现异常:

  • 进入地图页面时出现OpenGL渲染警告:
    D/OpenGLRenderer( 4700): eglCreateWindowSurface
    E/FrameEvents( 4700): updateAcquireFence: Did not find frame.
    
  • 退出页面时触发空指针异常,核心错误:
    V/GoogleMapController( 4700): Controller was disposed before GoogleMap was ready.
    E/PlatformViewsController( 4700): java.lang.NullPointerException: Attempt to invoke virtual method 'boolean java.util.LinkedList.isEmpty()' on a null object reference
    

使用依赖

google_maps_flutter: ^2.2.1

组件代码

import 'dart:async';

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

class GoogleMapWidget extends StatefulWidget {
  final double lat;
  final double lng;
  final String name;
  final String id;
  const GoogleMapWidget({
    Key? key,
    required this.lat,
    required this.lng,
    required this.name,
    required this.id,
  }) : super(key: key);
  @override
  State<GoogleMapWidget> createState() => _GoogleMapWidgetState();
}

class _GoogleMapWidgetState extends State<GoogleMapWidget> {
  final Completer<GoogleMapController> mapController = Completer();
  List<Marker> markers = <Marker>[];

  @override
  Widget build(BuildContext context) {
    markers.add(
      Marker(
        markerId: MarkerId(widget.id),
        position: LatLng(widget.lat, widget.lng),
        infoWindow: InfoWindow(title: widget.name),
      ),
    );
    return SizedBox(
      width: 350.0,
      height: 400.0,
      child: GoogleMap(
        initialCameraPosition: CameraPosition(
          target: LatLng(widget.lat, widget.lng),
          zoom: 15.0,
        ),
        mapType: MapType.normal,
        markers: Set<Marker>.of(markers),
        onMapCreated: (GoogleMapController controller) {
          mapController.complete(controller);
        },
      ),
    );
  }
}

组件调用方式

GoogleMapWidget(
  name: name,
  id: 'single_screen',
  lat: lat,
  lng: lng,
),

开发环境信息

[✓] Flutter (Channel stable, 3.3.4, on macOS 12.6 21G115 darwin-x64, locale en-EN)
[✓] Android toolchain - develop for Android devices (Android SDK version 30.0.3)
[✓] Xcode - develop for iOS and macOS (Xcode 13.4.1)
[✓] Chrome - develop for the web
[!] Android Studio (not installed)
[✓] VS Code (version 1.72.0)
[✓] Connected device (4 available)
[✓] HTTP Host Availability

解决方案

1. 修复组件生命周期与Marker管理问题

原代码在build方法中重复添加Marker,且未正确处理控制器销毁逻辑,修改后的代码如下:

import 'dart:async';

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

class GoogleMapWidget extends StatefulWidget {
  final double lat;
  final double lng;
  final String name;
  final String id;
  const GoogleMapWidget({
    Key? key,
    required this.lat,
    required this.lng,
    required this.name,
    required this.id,
  }) : super(key: key);

  @override
  State<GoogleMapWidget> createState() => _GoogleMapWidgetState();
}

class _GoogleMapWidgetState extends State<GoogleMapWidget> {
  final Completer<GoogleMapController> _mapController = Completer();
  late final Set<Marker> _markers;

  @override
  void initState() {
    super.initState();
    // 在initState初始化Marker,避免build重复添加
    _markers = {
      Marker(
        markerId: MarkerId(widget.id),
        position: LatLng(widget.lat, widget.lng),
        infoWindow: InfoWindow(title: widget.name),
      ),
    };
  }

  @override
  void dispose() {
    // 确保控制器在组件销毁时正确释放
    _mapController.future.then((controller) => controller.dispose());
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return SizedBox(
      width: 350.0,
      height: 400.0,
      child: GoogleMap(
        initialCameraPosition: CameraPosition(
          target: LatLng(widget.lat, widget.lng),
          zoom: 15.0,
        ),
        mapType: MapType.normal,
        markers: _markers,
        onMapCreated: (GoogleMapController controller) {
          if (!_mapController.isCompleted) {
            _mapController.complete(controller);
          }
        },
      ),
    );
  }
}

2. 升级依赖版本

google_maps_flutter: ^2.2.1存在Android平台生命周期处理bug,升级到较新稳定版本:
修改pubspec.yaml:

dependencies:
  google_maps_flutter: ^2.5.0 # 或更新的稳定版本

执行flutter pub get更新依赖。

3. 检查Android端配置

  • 确认AndroidManifest.xml中已正确配置Google Maps API Key,且该Key已启用Google Maps Android SDK:
<manifest ...>
  <application ...>
    <meta-data
        android:name="com.google.android.geo.API_KEY"
        android:value="你的API_KEY"/>
  </application>
</manifest>
  • 确保Android项目中play-services-maps与play-services-base版本兼容,避免版本冲突。

4. 优化页面退出逻辑

确保退出地图页面时,地图组件已完成初始化。可通过FutureBuilder等待地图控制器初始化完成,再允许页面销毁(根据业务场景调整)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 14:45:39