Trzepot Mapy Google, Próbując utworzyć już utworzony widok platformy, wyświetl id: 0

17

Po raz pierwszy trzepoczą mapy google, ładuje się idealnie, ale po ponownym uruchomieniu ponownie przechodzi do wyjątku platformy

google_maps_flutter: ^ 0,5.21 + 15

Github [google_maps_flutter] Próba utworzenia już utworzonego widoku platformy # 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

Doktor Flutter -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!
Lav Kushwaha
źródło

Odpowiedzi:

7

Aby rozwiązać ten problem, wykonałem następujące czynności za pośrednictwem terminala:

1- Zmieniłem oddział na Oddział główny:

flutter channel master

2 - Ulepszony trzepot

flutter upgrade

3- Wyczyściłem kod:

flutter clean

Yousef Gamal
źródło
1
tak, zrobiłem to samo i hot reload działa teraz, zmieniłem na master branch, uaktualnij trzepotanie i trzepotanie, a następnie aplikacja działa
Lav Kushwaha
1
Przełączenie na kanał główny i aktualizacja trzepotania rozwiąże problem. Dzięki +1 dla ciebie.
Vinoth Vino
1
Przejście do gałęzi master jest złym pomysłem. Oddział główny jest najbardziej niestabilny ze wszystkich. Kto szuka lepszego rozwiązania, powinien rozważyć inne odpowiedzi na to pytanie. github.com/flutter/flutter/wiki/Flutter-build-release-channels
fotonmoton
1
powinno być flutter cleanpisane małymi literami, jeśli ktoś może to edytować
Dimitar
1
@Dimitar Nie zauważyłem, że to była wielka litera, właśnie ją zredagowałem, dzięki za poinformowanie nas,
Yousef Gamal
7

Miałem również ten sam problem i używanie flutter cleango nie rozwiązało dla mnie ( wersja Flutter 1.12.13 + poprawka 8 )

Ale dodanie unikalnego klucza do widżetu (nie do jego stanu) rozwiązało problem.

minimalna działająca próbka kodu, aby to wykazać.

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
źródło
Dzięki Eyad, dodanie kluczy pomogło rozwiązać problem
Charden Daxicen
Do czasu wydania stabilnej wersji Flutter 1.17 myślę, że to poprawna odpowiedź na projekt produkcyjny
Pablo Insua
Czy możesz to wyjaśnić, dlaczego nie użyjemy klucza GoogleMap()?
Shahzad Akram
4

Zgodnie z API ,

Nie zmieniaj kamery za pomocą tej aktualizacji kamery, dopóki mapa nie zostanie zmieniona (aby ta metoda poprawnie określiła odpowiednią ramkę graniczną i poziom powiększenia, mapa musi mieć rozmiar). W przeciwnym razie zostanie zgłoszony wyjątek IllegalStateException.

Miałem ten sam problem i po pewnym debugowaniu wygląda na to, że za każdym razem, gdy przeładujesz, gdy mapa jest widoczna, wyświetli błąd.

Możesz jednak zapobiec błędowi, jeśli przeładujesz go po usunięciu mapy.

Innymi słowy, ma zapobiegać aktywacji wielu instancji map.

Proponuję więc zutylizować mapę przed ponownym ładowaniem na gorąco podczas opracowywania.

W wersji produkcyjnej użytkownicy nie będą mogli przeładować systemu na gorąco, dlatego nie napotkają problemu z platformą.

Steve Kim
źródło
3

Problem wynika z używania tego samego kontrolera w wielu widżetach GoogleMaps. Zbuduj tylko jeden widżet GoogleMap i użyj obiektu GoogleMapController, aby wprowadzić zmiany.

Nihal Ismail
źródło