Flutter Google Maps, Essayer de créer une vue de plate-forme déjà créée, afficher l'id: 0


17

Pour la première fois, Google Maps flutter, se charge parfaitement, mais lors d'un redémarrage à chaud, il passe à l'exception de la plate-forme

google_maps_flutter: ^ 0.5.21 + 15

Github [google_maps_flutter] Essayer de créer une vue de plateforme déjà créée # 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

Docteur 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!

Réponses:


7

Pour résoudre ce problème, j'ai fait ce qui suit via le terminal:

1- Changement de branche en branche Master:

flutter channel master

2- Flutter amélioré

flutter upgrade

3- Nettoyé le code:

flutter clean


1
oui, j'ai fait la même chose et le rechargement à chaud fonctionne maintenant, changé pour la branche principale, mettre à niveau le flutter et le flutter clean, puis l'application fonctionne
Lav Kushwaha

1
Le passage au canal maître et la mise à niveau du flutter résoudront le problème. Merci +1 pour vous.
Vinoth Vino

1
C'est une mauvaise idée de passer à la branche principale. La branche maître est la plus instable de toutes. Quiconque cherche une meilleure solution devrait envisager une autre réponse à cette question. github.com/flutter/flutter/wiki/Flutter-build-release-channels
fotonmoton

1
cela devrait être flutter cleanen minuscules si quelqu'un peut le modifier
Dimitar

1
@Dimitar Je n'ai pas remarqué qu'il s'agissait de majuscules, je viens de le modifier, merci de nous le faire savoir,
Yousef Gamal

7

J'ai également eu le même problème et l'utilisation flutter cleanne l'a pas résolu pour moi ( version Flutter 1.12.13 + correctif 8 )

Mais ensuite, l' ajout d'une clé unique au widget (pas à son état) a résolu le problème pour moi.

exemple de code de travail minimum pour le démontrer.

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

Merci Eyad, l'ajout de clés a aidé à résoudre le problème
Charden Daxicen

Jusqu'à la sortie de Flutter 1.17 stable, je pense que c'est la bonne réponse pour un projet en production
Pablo Insua

Pouvez-vous expliquer pourquoi nous n'utilisons pas de clé GoogleMap()?
Shahzad Akram

4

Selon l' API ,

Ne changez pas la caméra avec cette mise à jour de la caméra tant que la carte n'a pas été mise en page (pour que cette méthode détermine correctement le cadre de sélection et le niveau de zoom appropriés, la carte doit avoir une taille). Sinon, une exception IllegalStateException sera levée.

J'ai eu le même problème et après un débogage, il semble que chaque fois que vous rechargez à chaud pendant que la carte est en vue, cela donnera l'erreur.

Mais vous pouvez éviter l'erreur si vous rechargez à chaud après avoir supprimé la carte.

En d'autres termes, il est là pour empêcher l'activation de plusieurs instances de cartes.

Je suggère donc de disposer de la carte avant le rechargement à chaud pendant le développement.

Dans une version de production, les utilisateurs ne pourront pas recharger à chaud ainsi, ils ne rencontreront pas le problème de plate-forme.


3

Le problème est dû à l'utilisation du même contrôleur dans plusieurs widgets GoogleMaps. Créez un seul widget GoogleMap et utilisez l'objet GoogleMapController pour apporter des modifications.


En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.