Flutter Android应用无法渲染Google Map的问题求助
问题
我想在Android应用中渲染一个简单的Google Map,已经启用Google Map API并配置到AndroidManifest.xml,也更新了pubspec.yaml和build.gradle文件,但试了多种组合后还是无法在屏幕上显示地图。查了很多资料都没解决,每次执行flutter pub get后会出现依赖版本不兼容提示。
执行flutter pub get的输出
[demo] flutter pub get --no-example Resolving dependencies... google_maps 6.3.0 (7.0.0 available) js 0.6.7 (0.7.0 available) leak_tracker 10.0.0 (10.0.4 available) leak_tracker_flutter_testing 2.0.1 (3.0.3 available) leak_tracker_testing 2.0.1 (3.0.1 available) meta 1.11.0 (1.12.0 available) test_api 0.6.1 (0.7.0 available) vm_service 13.0.0 (14.0.0 available) Got dependencies! 8 packages have newer versions incompatible with dependency constraints. Try flutter pub outdated for more information. exit code 0
相关代码配置
main.dart
import 'package:flutter/material.dart'; import 'package:google_maps_flutter/google_maps_flutter.dart'; void main() { runApp(MyApp()); } class MyApp extends StatefulWidget { @override _MyAppState createState() => _MyAppState(); } class _MyAppState extends State<MyApp> { // 纽约坐标 LatLng _center = const LatLng(40.7128, -74.0060); final Set<Marker> _markers = {}; void _onMapCreated(GoogleMapController controller) { setState(() { _markers.add( Marker( markerId: MarkerId("my_marker"), position: _center, infoWindow: InfoWindow( title: "Flutter Google Map", snippet: "Created by you!", ), ), ); }); } @override Widget build(BuildContext context) { return MaterialApp( home: Scaffold( appBar: AppBar( title: Text('My Google Map'), ), body: GoogleMap( onMapCreated: _onMapCreated, initialCameraPosition: CameraPosition( target: _center, zoom: 11.0, ), markers: _markers, ), ), ); } }
AndroidManifest.xml
<manifest xmlns:android="http://schemas.android.com/apk/res/android"> <application android:label="demo" android:name="${applicationName}" android:icon="@mipmap/ic_launcher"> <meta-data android:name="com.google.android.geo.API_KEY" android:value="API_KEY"/> <activity android:name=".MainActivity" android:exported="true" android:launchMode="singleTop" android:theme="@style/LaunchTheme" android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode" android:hardwareAccelerated="true" android:windowSoftInputMode="adjustResize"> <!-- 指定Android进程启动后立即应用于此Activity的主题。在Flutter UI初始化期间,用户会看到此主题。之后,此主题将继续决定Flutter UI背后的窗口背景。 --> <meta-data android:name="io.flutter.embedding.android.NormalTheme" android:resource="@style/NormalTheme" /> <intent-filter> <action android:name="android.intent.action.MAIN"/> <category android:name="android.intent.category.LAUNCHER"/> </intent-filter> </activity> <!-- 不要删除以下meta-data,Flutter工具会用它生成GeneratedPluginRegistrant.java --> <meta-data android:name="flutterEmbedding" android:value="2" /> </application> <!-- 需要查询可处理文本的Activity,详情参考官方文档。此配置主要用于Flutter引擎的ProcessTextPlugin插件。 --> <queries> <intent> <action android:name="android.intent.action.PROCESS_TEXT"/> <data android:mimeType="text/plain"/> </intent> </queries> </manifest>
pubspec.yaml
name: demo description: "一个新的Flutter项目。" # 以下代码防止包通过`flutter pub publish`意外发布到pub.dev,私有包建议保留此配置 publish_to: "none" # 若要发布到pub.dev,删除此行 # 以下代码定义应用的版本和构建号。版本号是由点分隔的三个数字,如1.2.43,后面可以跟一个由+分隔的可选构建号。 # 在flutter build中,可以通过指定--build-name和--build-number分别覆盖版本号和构建号。 # 在Android中,build-name用作versionName,build-number用作versionCode。 # 在iOS中,build-name用作CFBundleShortVersionString,build-number用作CFBundleVersion。 # 在Windows中,build-name用作产品和文件版本的主版本、次版本和补丁部分,build-number用作构建后缀。 version: 1.0.0+1 environment: sdk: ">=3.3.0 <4.0.0" # 依赖项指定项目运行所需的其他包。 # 若要自动升级依赖到最新版本,可执行`flutter pub upgrade --major-versions`。 # 也可以手动修改版本号为pub.dev上的最新版本,执行`flutter pub outdated`可查看有更新的依赖。 dependencies: flutter: sdk: flutter google_maps_flutter: ^2.5.3 # 以下依赖添加Cupertino Icons字体到应用中,可通过CupertinoIcons类使用iOS风格图标。 cupertino_icons: ^1.0.6 dev_dependencies: flutter_test: sdk: flutter # 以下flutter_lints包包含一组推荐的代码规范检查规则,规则集合会在项目根目录的analysis_options.yaml文件中启用。 # 可在该文件中禁用特定规则或启用额外规则。 flutter_lints: ^3.0.0 # 关于pubspec文件的通用Dart部分,可查看官方文档。 # 以下部分是Flutter包特有的配置。 flutter: # 以下代码确保Material Icons字体包含在应用中,这样就能使用material Icons类中的图标。 uses-material-design: true
解决方案
1. 升级依赖版本
你当前使用的google_maps_flutter版本^2.5.3较旧,和Flutter SDK(3.3.0+)存在兼容性匹配问题。直接升级到最新稳定版:
修改pubspec.yaml中的依赖:
google_maps_flutter: ^2.6.0 # 或直接查看pub.dev获取最新兼容版本号
执行以下命令更新依赖:
flutter pub upgrade --major-versions flutter pub get
这会自动处理依赖冲突,更新到符合SDK约束的版本。
2. 验证Google Map API配置
- 确认
AndroidManifest.xml中的API_KEY是有效密钥,且已在Google Cloud控制台启用Maps SDK for Android服务。 - 检查密钥是否绑定了正确的SHA-1指纹和应用包名(
demo),如果密钥限制过严,地图会加载失败。
3. 添加必要的Android权限
在AndroidManifest.xml的<manifest>标签下添加地图加载所需的权限:
<!-- 网络权限,地图加载需要联网 --> <uses-permission android:name="android.permission.INTERNET" /> <!-- 访问网络状态,判断设备是否联网 --> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <!-- 定位权限(可选,若需使用定位功能则添加) --> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
4. 清理并重新构建项目
- 清理Flutter缓存:
flutter clean
- 重新构建并运行项目:
flutter build apk flutter run
5. 优化地图初始化逻辑
你的main.dart代码逻辑无问题,但可将标记初始化提前到initState中,避免onMapCreated中的延迟加载,方便验证地图是否正常渲染:
@override void initState() { super.initState(); _markers.add( Marker( markerId: MarkerId("my_marker"), position: _center, infoWindow: InfoWindow( title: "Flutter Google Map", snippet: "Created by you!", ), ), ); }
内容的提问来源于stack exchange,提问作者deepak s p
相关产品推荐
相关产品推荐

