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

在 Flutter 中动态创建一列行的好方法是啥

google_maps_flutter 与 flutter_facebook_login 不兼容

Flutter 浮动操作按钮错误!尝试创建一排具有响应式触摸效果的按钮