Flutter Googleマップ、既に作成されているプラ​​ットフォームビューを作成しようとしています。ビューID:0


17

初めてグーグルマップがばたつく、ロードは完璧ですが、それをホットリスタートすると、プラットフォーム例外になります

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

フラッタードクター-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 -0800Engine 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/SdkAndroid NDK location not configured (optional; useful for native profiling support)Platform android-29, build-tools 29.0.2Java 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.1Dart plugin version 191.8593Java version OpenJDK Runtime Environment (build 1.8.0_202-release-1483-b49-5587405)

[] Connected device (1 available)
    • vivo 172349269ad3 • android-arm64 • Android 9 (API 28)No issues found!

回答:


7

この問題を解決するために、ターミナルから次のことを行いました。

1-ブランチをマスターブランチに変更しました:

flutter channel master

2-アップグレードされたフラッター

flutter upgrade

3-コードをクリーンアップ:

flutter clean


1
はい、同じことを行いました。ホットリロードが機能し、masterブランチに変更され、フラッターとフラッターがクリーンにアップグレードされました。アプリは機能しています
Lav Kushwaha

1
マスターチャネルに切り替えてフラッターをアップグレードすると、問題が解決します。+1ありがとうございます。
Vinoth Vino

1
マスターブランチに切り替えるのは悪い考えです。マスターブランチはすべての中で最も不安定です。より良い解決策を探している人は、この質問に対する別の回答を検討する必要があります。 github.com/flutter/flutter/wiki/Flutter-build-release-channels
フォトンモトン

1
それがあるべきflutter clean誰かがそれを編集することができた場合、下部ケースと
ディミタール

1
@Dimitar大文字であることに気づかなかった。知らせてくれてありがとう、編集したところだ
ユセフ・ガマル

7

私も同じ問題があり、使用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に感謝、キーの追加が問題の解決に役立ちました
Charden Daxicen

Flutter 1.17がリリースされるまでは、これが本番プロジェクトの正解だと思います
Pablo Insua

なぜキーを使用しないのGoogleMap()ですか?
Shahzad Akram

4

APIによると、

マップがレイアウトされるまで、このカメラアップデートでカメラを変更しないでください(このメソッドが適切なバウンディングボックスとズームレベルを正しく決定するには、マップにサイズが必要です)。そうでない場合は、IllegalStateExceptionがスローされます。

私は同じ問題を抱えていましたが、いくつかのデバッグの後、マップが表示されているときにホットリロードするとエラーが発生するようです。

ただし、マップを破棄した後でホットリロードすると、エラーを回避できます。

つまり、マップの複数のインスタンスがアクティブになるのを防ぐためです。

そのため、開発中のホットリロードの前にマップを破棄することをお勧めします。

本番バージョンでは、ユーザーはホットリロードできないため、プラットフォームの問題は発生しません。


3

この問題は、複数のGoogleMapsウィジェットで同じコントローラーを使用することが原因です。GoogleMapウィジェットを1つだけ作成し、GoogleMapControllerオブジェクトを使用して変更を加えます。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.