Flutter Google Maps,尝试创建一个已经创建好的平台视图,视图 ID:0

Lav*_*aha 19 android google-maps flutter google-maps-flutter

第一次谷歌地图颤动,加载完美,但当热重启时,它进入平台异常

google_maps_flutter:^0.5.21+15

Github [google_maps_flutter] 尝试创建已创建的平台视图 #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
Run Code Online (Sandbox Code Playgroud)

颤振医生 -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!
Run Code Online (Sandbox Code Playgroud)

You*_*mal 9

为了解决这个问题,我通过终端执行了以下操作:

1- 将分支更改为 Master 分支:

flutter channel master

2- 升级 Flutter

flutter upgrade

3-清理代码:

flutter clean

  • 切换到 master 分支不是一个好主意。Master 分支是所有分支中最不稳定的。任何寻求更好解决方案的人都应该考虑这个问题的另一个答案。https://github.com/flutter/flutter/wiki/Flutter-build-release-channels (2认同)

Eya*_*yad 9

我也有同样的问题,使用flutter clean并没有为我解决它(颤振版本 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,
          ),
        )
    );
  }
}
Run Code Online (Sandbox Code Playgroud)


小智 5

问题是由于在多个 GoogleMaps 小部件中使用了相同的控制器。仅构建一个 GoogleMap 小部件并使用 GoogleMapController 对象进行任何更改。