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
相关产品推荐
相关产品推荐

