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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 16:18:21