Flutter 3.0.3升级后Google Maps加载导致应用无日志崩溃问题求助
Flutter 3.x版本Google Maps插件无日志闪退问题处理
问题现象
- 项目Flutter版本从2.10.3升级至3.0.0、3.0.3后,仅
AddAddressScreen页面加载地图组件时触发应用直接闪退 - 崩溃全程无Dart层错误日志输出,接入Google Crashlytics也无法捕获对应异常堆栈
- 相同业务代码在Flutter 2.10.3环境下运行完全正常
现有代码与依赖配置
涉及页面实现代码
import 'package:google_maps_flutter/google_maps_flutter.dart'; class AddAddressScreen extends StatefulWidget { const AddAddressScreen({Key? key}) : super(key: key); @override State<AddAddressScreen> createState() => _AddAddressScreenState(); } class _AddAddressScreenState extends State<AddAddressScreen> { TextEditingController _addressController = TextEditingController(); late bool _isLoggedIn; CameraPosition _cameraPosition = CameraPosition(target: LatLng(9.072264, 7.491302), zoom: 17); late Position position; LatLng _initialPosition = LatLng(9.072264, 7.491302); bool locationLoaded = false; @override void initState() { super.initState(); // _getUserCurrentPosition(); _isLoggedIn = Get.find<AuthController>().userIsLoggedIn(); if (_isLoggedIn && Get.find<UserController>().userModel == null) { Get.find<UserController>().getUserInfo(); } if (Get.find<LocationController>().addressList.isNotEmpty) { double lat = double.parse(Get.find<LocationController>().getAddress["latitude"]); double lng = double.parse(Get.find<LocationController>().getAddress["longitude"]); //set saved user address to camera position _cameraPosition = CameraPosition(target: LatLng(lat, lng), zoom: 17); //set initial position to saved user address _initialPosition = LatLng(lat, lng); } } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: TitleTextWidget( titleText: 'Add Address', titleColor: AppStyles.appSecondaryColor), leading: GestureDetector( onTap: () { Get.back(); }, child: const Icon(Icons.arrow_back_outlined, color: AppStyles.appSecondaryColor), ), backgroundColor: AppStyles.appPrimaryColor, ), backgroundColor: Colors.white, body: GetBuilder<LocationController>(builder: (locationController) { return SingleChildScrollView( child: Column( children: [ Container( height: SizeConfig.height140, width: double.maxFinite, margin: EdgeInsets.only( left: SizeConfig.width5, right: SizeConfig.width5, top: SizeConfig.height5), decoration: BoxDecoration( borderRadius: BorderRadius.circular(SizeConfig.radius5), border: Border.all( width: 2, color: AppStyles.appPrimaryColor)), child: Stack( children: [ GoogleMap( initialCameraPosition: CameraPosition( target: _initialPosition, zoom: 17)) ], )), Padding( padding: EdgeInsets.only( left: SizeConfig.width20, top: SizeConfig.height20), child: SizedBox( height: SizeConfig.height50, child: ListView.builder( shrinkWrap: true, scrollDirection: Axis.horizontal, itemCount: locationController.addressTypeList.length, itemBuilder: ((context, index) { return InkWell( onTap: () { locationController.setAddressTypeIndex(index); }, child: Container( padding: EdgeInsets.symmetric( horizontal: SizeConfig.width20, vertical: SizeConfig.width20), margin: EdgeInsets.only(right: SizeConfig.width10), decoration: BoxDecoration( borderRadius: BorderRadius.circular(SizeConfig.radius5), color: Theme.of(context).cardColor, boxShadow: [ BoxShadow( color: Colors.grey.shade300, spreadRadius: 1, blurRadius: 5) ], ), child: Icon( index == 0 ? Icons.home_filled : index == 1 ? Icons.work_outlined : Icons.location_on_outlined, color: locationController.addressTypeIndex == index ? AppStyles.appPrimaryColor : AppStyles.appSecondaryColor, ), ), ); })), ), ), SizedBox(height: SizeConfig.height20), Padding( padding: EdgeInsets.only(left: SizeConfig.width10), child: TitleTextWidget(titleText: 'Service Address'), ), SizedBox(height: SizeConfig.height20), buildAddress(), ], ), ); }), ); } }
pubspec.yaml相关依赖配置
#Maps & Geolocator google_maps_flutter: ^2.1.8 geolocator: ^8.2.0 geocoding: ^2.0.4 flutter_google_places: ^0.3.0
问题根因
- 所用
google_maps_flutter 2.1.8版本发布于Flutter 3正式版推送前,未适配Flutter 3重构后的平台视图渲染逻辑,Android端会触发原生层内存访问冲突崩溃。崩溃发生在原生C++渲染层,因此Dart层日志、Crashlytics的Dart异常捕获机制均无法采集堆栈信息。 - 代码中直接将
GoogleMap原生平台视图放在SingleChildScrollView子树中,Flutter 3.x调整了滚动视图内平台视图的布局计算逻辑,旧版插件未适配该变化,会直接触发渲染线程崩溃。 - 配套的
geolocator 8.2.0等关联依赖旧版本也存在Flutter 3.x ABI兼容问题,会提升崩溃触发概率。
修复方案
- 升级地图相关依赖到Flutter 3兼容的稳定版本,将pubspec.yaml中对应依赖替换为以下版本后执行
flutter pub get同步:
#Maps & Geolocator google_maps_flutter: ^2.2.8 geolocator: ^9.0.2 geocoding: ^2.1.1 flutter_google_places: ^0.3.0+1
- 修复滚动视图内地图组件的渲染冲突,移除原有包裹地图的带边框Container,改用
ClipRRect显式声明裁剪边界,同时给地图组件添加手势识别器声明,避免滚动布局与地图的手势冲突触发渲染异常,替换后的地图组件代码如下:
Container( height: SizeConfig.height140, width: double.maxFinite, margin: EdgeInsets.only( left: SizeConfig.width5, right: SizeConfig.width5, top: SizeConfig.height5), child: Stack( children: [ ClipRRect( borderRadius: BorderRadius.circular(SizeConfig.radius5), child: GoogleMap( initialCameraPosition: CameraPosition( target: _initialPosition, zoom: 17), gestureRecognizers: <Factory<OneSequenceGestureRecognizer>>{ Factory<OneSequenceGestureRecognizer>( () => EagerGestureRecognizer(), ), }, ) ), // 单独添加边框避免原生视图被边框属性影响布局 IgnorePointer( child: Container( decoration: BoxDecoration( borderRadius: BorderRadius.circular(SizeConfig.radius5), border: Border.all( width: 2, color: AppStyles.appPrimaryColor)), ), ) ], ), )
- 清理原生构建缓存,避免旧版插件的编译产物残留,依次执行以下命令:
flutter clean rm -rf ios/Pods ios/Podfile.lock android/.gradle android/app/build flutter pub get # iOS端进入ios目录执行pod install --repo-update更新原生依赖 # 构建前确认AndroidManifest、Info.plist中配置的Google Maps API Key未丢失
- Android端临时规避方案:如果暂时无法升级依赖,可在AndroidManifest.xml的application标签下添加如下配置,关闭Impeller渲染引擎绕过平台视图兼容问题:
<meta-data android:name="io.flutter.embedding.android.EnableImpeller" android:value="false" />
该临时方案仅对Android端生效,iOS端出现同类闪退必须升级依赖版本,无其他绕过路径。
内容的提问来源于stack exchange,提问作者Sharada Sharma
相关产品推荐
相关产品推荐

