【问题标题】:Flutter Google Maps, Trying to create an already created platform view, view id: 0Flutter Google Maps,试图创建一个已经创建的平台视图,视图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!

【问题讨论】:

    标签: android google-maps flutter google-maps-flutter


    【解决方案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

        【讨论】:

          猜你喜欢
          • 2020-06-03
          • 2020-01-07
          • 2017-08-07
          • 2020-04-18
          • 1970-01-01
          • 2021-07-05
          • 2020-05-12
          • 1970-01-01
          • 2015-02-25
          相关资源
          最近更新 更多