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

Flutter 3.3.9中Stack嵌套GoogleMap时组件不可见但可交互问题求助

问题描述

在Stack组件中嵌套GoogleMap后,上层所有Widget(如按钮、CustomInfoWindow)均不可见,但仍可正常交互(按钮点击能执行对应操作)。

  • Flutter版本:3.3.9(stable)
  • google_maps_flutter版本:2.2.2
  • 此前基于Flutter2的相同代码逻辑可正常运行,甚至FloatingActionButton也出现同样的不可见问题。

截图:

  • 地图加载时按钮可见:地图加载时显示按钮
  • 地图创建完成后按钮消失:地图创建完成后的截图

Widget树代码:

Stack(
children: <Widget>[

  Container(
    child: Obx(
          () => GoogleMap(
        onTap: (position) {
          _customInfoWindowController.hideInfoWindow!();
        },
        onCameraMove: (position) {
          _customInfoWindowController.onCameraMove!();
        },
        onMapCreated: (GoogleMapController controller) {
          _customInfoWindowController.googleMapController =
              controller;
          newGoogleMapController = controller;
          updateCameraPosition(
              -8.466803395691676, 115.2199474850532, false);
        },
        zoomGesturesEnabled: false,
        myLocationEnabled: true,
        mapToolbarEnabled: true,
        zoomControlsEnabled: false,
        tiltGesturesEnabled: false,
        markers: Set<Marker>.of(markers.value),
        initialCameraPosition: _initialCameraPosition,
      ),
    ),
  ),


  Container(
    child: WidgetButton.btnStyle2(
        name: 'Update Camera Maps',
        action: () {
          updateCameraPosition(
              -8.371809235984502, 114.93838766787734, true);
        }),
  ),
  CustomInfoWindow(
    controller: _customInfoWindowController,
    height: 500,
    width: 500,
    offset: 50,
  ),
  ],
);

flutter doctor -v信息:

[√] Flutter (Channel stable, 3.3.9, on Microsoft Windows [Version 10.0.22621.900], locale en-ID)
    • Flutter version 3.3.9 on channel stable at C:\android\flutter
    • Upstream repository https://github.com/flutter/flutter.git
    • Framework revision b8f7f1f986 (3 weeks ago), 2022-11-23 06:43:51 +0900
    • Engine revision 8f2221fbef
    • Dart version 2.18.5
    • DevTools version 2.15.0

Checking Android licenses is taking an unexpectedly long time...[√] Android toolchain - develop for Android devices (Android SDK version 30.0.3)
    • Android SDK at C:\Users\User\AppData\Local\Android\sdk
    • Platform android-33, build-tools 30.0.3
    • Java binary at: C:\Program Files\Android\Android Studio\jre\bin\java
    • Java version OpenJDK Runtime Environment (build 11.0.13+0-b1751.21-8125866)
    • All Android licenses accepted.

[√] Chrome - develop for the web
    • Chrome at C:\Program Files (x86)\Google\Chrome\Application\chrome.exe

[√] Android Studio (version 2021.3)
    • Android Studio at C:\Program Files\Android\Android Studio
    • Flutter plugin can be installed from:
       https://plugins.jetbrains.com/plugin/9212-flutter
    • Dart plugin can be installed from:
       https://plugins.jetbrains.com/plugin/6351-dart
    • Java version OpenJDK Runtime Environment (build 11.0.13+0-b1751.21-8125866)

[√] VS Code (version 1.73.1)
    • VS Code at C:\Users\User\AppData\Local\Programs\Microsoft VS Code
    • Flutter extension version 3.54.0
解决方案

这个问题源于Flutter 3.x版本中Android平台的platform view渲染模式变更:GoogleMap属于原生平台视图,默认优先级会覆盖Flutter渲染的Widget,即便它们在Stack的上层。以下是几种可行的解决方式:

方法1:全局修改Android渲染模式

在android/app/src/main/AndroidManifest.xml的<application>标签下添加元数据,强制使用旧版的surface渲染模式:

<meta-data android:name="flutter.platformviews.android_views_render_mode" android:value="surface"/>

该方式操作简单,全局生效,适合大多数场景。

方法2:单独处理GoogleMap的渲染层级

如果不想全局修改渲染模式,可以用AndroidViewSurface包裹GoogleMap(注意这是Flutter内部API,后续版本可能有变动):

import 'package:flutter/src/platform_view/android/android_view_surface.dart';

// ...

Container(
  child: Obx(
    () => AndroidViewSurface(
      controller: AndroidViewController(
        viewType: 'plugins.flutter.io/google_maps',
        layoutDirection: TextDirection.ltr,
        creationParams: const {},
        creationParamsCodec: const StandardMessageCodec(),
      ),
      hitTestBehavior: PlatformViewHitTestBehavior.opaque,
      gestureRecognizers: const <Factory<OneSequenceGestureRecognizer>>{},
      child: GoogleMap(
        // 保留原GoogleMap的所有配置
        onTap: (position) {
          _customInfoWindowController.hideInfoWindow!();
        },
        onCameraMove: (position) {
          _customInfoWindowController.onCameraMove!();
        },
        onMapCreated: (GoogleMapController controller) {
          _customInfoWindowController.googleMapController = controller;
          newGoogleMapController = controller;
          updateCameraPosition(
              -8.466803395691676, 115.2199474850532, false);
        },
        zoomGesturesEnabled: false,
        myLocationEnabled: true,
        mapToolbarEnabled: true,
        zoomControlsEnabled: false,
        tiltGesturesEnabled: false,
        markers: Set<Marker>.of(markers.value),
        initialCameraPosition: _initialCameraPosition,
      ),
    ),
  ),
),

方法3:升级依赖版本

尝试将google_maps_flutter升级到最新稳定版,新版本可能已修复该层级问题。修改pubspec.yaml中的依赖:

google_maps_flutter: ^最新稳定版号

执行flutter pub get更新依赖后重新运行项目。

验证建议

优先尝试方法1,操作成本最低且见效快;若需精细化控制再考虑方法2;方法3适合长期维护项目,从依赖层面彻底解决问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 20:30:41