Flutter Google Maps,试图创建一个已经创建的平台视图,视图id:0
Posted
技术标签:
【中文标题】Flutter Google Maps,试图创建一个已经创建的平台视图,视图id:0【英文标题】:Flutter Google Maps, Trying to create an already created platform view, view id: 0 【发布时间】:2020-04-17 21:34:43 【问题描述】:第一次谷歌地图颤动,加载完美,但热重启时,它进入平台异常
google_maps_flutter:^0.5.21+15
Github [google_maps_flutter] Trying to create an already created platform view #45695
[ERROR:flutter/lib/ui/ui_dart_state.cc(157)] Unhandled Exception: PlatformException(error, java.lang.IllegalStateException: Trying to create an already created platform view, view id: 0
颤振医生-v
[✓] Flutter (Channel stable, v1.12.13+hotfix.5, on Linux, locale en_IN)
• Flutter version 1.12.13+hotfix.5 at /home/asus/Documents/Flutter_SDK/flutter
• Framework revision 27321ebbad (2 weeks ago), 2019-12-10 18:15:01 -0800
• Engine revision 2994f7e1e6
• Dart version 2.7.0
[✓] android toolchain - develop for Android devices (Android SDK version 29.0.2)
• Android SDK at /home/asus/Android/Sdk
• Android NDK location not configured (optional; useful for native profiling support)
• Platform android-29, build-tools 29.0.2
• Java binary at: /snap/android-studio/81/android-studio/jre/bin/java
• Java version OpenJDK Runtime Environment (build 1.8.0_202-release-1483-b49-5587405)
• All Android licenses accepted.
[✓] Android Studio (version 3.5)
• Android Studio at /snap/android-studio/81/android-studio
• Flutter plugin version 42.1.1
• Dart plugin version 191.8593
• Java version OpenJDK Runtime Environment (build 1.8.0_202-release-1483-b49-5587405)
[✓] Connected device (1 available)
• vivo 1723 • 49269ad3 • android-arm64 • Android 9 (API 28)
• No issues found!
【问题讨论】:
【参考方案1】:为了解决这个问题,我通过终端执行了以下操作:
1- 将分支更改为 Master 分支:
flutter channel master
2- 升级 Flutter
flutter upgrade
3- 清理代码:
flutter clean
【讨论】:
是的,我做了同样的事情,现在热重载正在工作,更改为 master 分支,升级颤振和颤振清洁,然后应用程序正在工作 切换到master频道,升级flutter即可解决问题。感谢您为您 +1。 切换到master分支是个坏主意。 Master 分支是最不稳定的。寻求更好解决方案的人应该考虑这个问题的另一个答案。 github.com/flutter/flutter/wiki/Flutter-build-release-channels 如果有人可以编辑它应该是flutter clean
小写
@Dimitar 我没有注意到它是大写的,我刚刚编辑了它,谢谢你告诉我们,【参考方案2】:
我也遇到了同样的问题,使用 flutter clean
并没有为我解决(flutter 版本 1.12.13+hotfix 8)
但是,向小部件添加唯一键(而不是向其状态)为我解决了这个问题。
演示这一点的最小工作代码示例。
import 'package:flutter/material.dart';
import 'package:google_maps_flutter/google_maps_flutter.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget
@override
Widget build(BuildContext context)
return MaterialApp(
title: 'Map not crashing demo',
debugShowCheckedModeBanner: false,
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: LocationScreen(),
);
class LocationScreen extends StatefulWidget
final Key _mapKey = UniqueKey();
@override
_LocationScreenState createState() => _LocationScreenState();
class _LocationScreenState extends State<LocationScreen>
@override
Widget build(BuildContext context)
return Scaffold(
appBar: AppBar(title: const Text('Map not crashing demo')),
body: TheMap(key:widget._mapKey)
);
class TheMap extends StatefulWidget
///key is required, otherwise map crashes on hot reload
TheMap( @required Key key)
:
super(key:key);
@override
_MyAppState createState() => _MyAppState();
class _MyAppState extends State<TheMap>
GoogleMapController _mapController ;
void _onMapCreated(GoogleMapController controller)
_mapController = controller;
@override
Widget build(BuildContext context)
return Scaffold(
//also this avoids it crashing/breaking when the keyboard is up
resizeToAvoidBottomInset: false,
body: GoogleMap(
onMapCreated: _onMapCreated,
initialCameraPosition: CameraPosition(
target: const LatLng(30.0925973,31.3219982),
zoom: 11.0,
),
)
);
【讨论】:
感谢 Eyad,添加密钥有助于解决问题 直到 Flutter 1.17 stable 发布之前,我认为这是生产中项目的正确答案 您能否详细说明我们为什么不在GoogleMap()
中使用密钥?【参考方案3】:
问题是由于在多个 GoogleMaps 小部件中使用了相同的控制器。只构建一个 GoogleMap 小部件并使用 GoogleMapController 对象进行任何更改。
【讨论】:
【参考方案4】:根据API,
在地图完成布局之前,请勿使用此相机更新更改相机(为了使此方法正确确定适当的边界框和缩放级别,地图必须具有大小)。否则将抛出 IllegalStateException。
我遇到了同样的问题,经过一些调试后,看起来每当您在地图处于视野时进行热重载时,都会出现错误。
但如果在处理地图后热重载,则可以防止错误。
换句话说,它可以防止多个地图实例处于活动状态。
所以我建议在开发过程中热重载之前处理地图。
在生产版本中,用户将无法热重载,因此他们不会遇到平台问题。
【讨论】:
【参考方案5】:这里引用了这个问题:https://github.com/flutter/flutter/issues/45695
【讨论】:
以上是关于Flutter Google Maps,试图创建一个已经创建的平台视图,视图id:0的主要内容,如果未能解决你的问题,请参考以下文章
在 google maps api v3 中隐藏方向服务中的标记
Android Google Maps:使用折线在多边形中切孔
跟踪公交GPS点是否在路上 - Google Maps API