Flattern Google Maps, Versuch, eine bereits erstellte Plattformansicht zu erstellen, Ansichts-ID: 0


17

Zum ersten Mal flattern Google Maps, laden perfekt, aber wenn es heiß gestartet wird, geht es zur Plattformausnahme

google_maps_flutter: ^ 0.5.21 + 15

Github [google_maps_flutter] Es wurde versucht, eine bereits erstellte Plattformansicht # 45695 zu erstellen

[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

Flattern Doktor -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!

Antworten:


7

Um dieses Problem zu lösen, habe ich Folgendes über das Terminal getan:

1- Der Zweig wurde in Hauptzweig geändert:

flutter channel master

2- Verbessertes Flattern

flutter upgrade

3- Den Code bereinigt:

flutter clean


1
Ja, ich habe das gleiche getan und Hot Reload funktioniert jetzt, geändert in Master Branch, Upgrade des Flatterns und Flattern Clean, dann funktioniert die App
Lav Kushwaha

1
Durch Umschalten auf den Masterkanal und Aufrüsten des Flatterns wird das Problem behoben. Danke +1 für dich.
Vinoth Vino

1
Es ist eine schlechte Idee, zum Hauptzweig zu wechseln. Der Hauptzweig ist unter allen am instabilsten. Wer nach einer besseren Lösung sucht, sollte eine andere Antwort auf diese Frage in Betracht ziehen. github.com/flutter/flutter/wiki/Flutter-build-release-channels
fotonmoton

1
es sollte in flutter cleanKleinbuchstaben sein, wenn jemand es bearbeiten kann
Dimitar

1
@ Dimitar Ich habe nicht bemerkt, dass es sich um Großbuchstaben handelt. Ich habe es gerade bearbeitet. Vielen Dank, dass Sie uns informiert haben.
Yousef Gamal

7

Ich hatte auch das gleiche Problem und die Verwendung flutter cleanlöste es nicht für mich ( Flatterversion 1.12.13 + Hotfix 8 )

Aber dann hat das Hinzufügen eines eindeutigen Schlüssels zum Widget (nicht zu seinem Status) das Problem für mich gelöst.

Beispiel für einen minimalen Arbeitscode, um dies zu demonstrieren.

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,
          ),
        )
    );
  }
}

Danke Eyad, das Hinzufügen von Schlüsseln hat geholfen, das Problem zu lösen
Charden Daxicen

Bis zur Veröffentlichung von Flutter 1.17 Stable denke ich, dass dies die richtige Antwort für ein Projekt in Produktion ist
Pablo Insua

Können Sie näher erläutern, warum wir keinen Schlüssel verwenden GoogleMap()?
Shahzad Akram

4

Laut API ,

Ändern Sie die Kamera mit diesem Kamera-Update erst, wenn die Karte einem Layout unterzogen wurde (damit diese Methode den entsprechenden Begrenzungsrahmen und die Zoomstufe korrekt bestimmt, muss die Karte eine Größe haben). Andernfalls wird eine IllegalStateException ausgelöst.

Ich hatte das gleiche Problem und nach einigem Debuggen sieht es so aus, als würde der Fehler angezeigt, wenn Sie während der Ansicht der Karte ein Hotreload durchführen.

Sie können den Fehler jedoch verhindern, wenn Sie nach dem Entsorgen der Karte ein Hot-Reload durchführen.

Mit anderen Worten, es soll verhindern, dass mehrere Instanzen von Karten aktiv sind.

Daher würde ich vorschlagen, die Karte vor dem erneuten Laden während der Entwicklung zu entsorgen.

In einer Produktionsversion können Benutzer kein Hot-Reload durchführen, sodass das Plattformproblem nicht auftritt.


3

Das Problem ist auf die Verwendung desselben Controllers in mehreren GoogleMaps-Widgets zurückzuführen. Erstellen Sie nur ein GoogleMap-Widget und verwenden Sie das GoogleMapController-Objekt, um Änderungen vorzunehmen.


Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.