Flutter Google Maps, intentando crear una vista de plataforma ya creada, id de vista: 0

17

Por primera vez, Google Maps revolotea, carga perfecto, pero cuando se reinicia en caliente, va a la excepción de la plataforma

google_maps_flutter: ^ 0.5.21 + 15

Github [google_maps_flutter] Intentando crear una vista de plataforma ya creada # 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

Flutter doctor -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
fuente

Respuestas:

7

Para resolver este problema, hice lo siguiente a través del terminal:

1- Cambió la rama a la rama maestra:

flutter channel master

2- Aleteo mejorado

flutter upgrade

3- Limpié el código:

flutter clean

Yousef Gamal
fuente
1
Sí, hice lo mismo y la recarga en caliente ahora funciona, cambié a la rama maestra, actualicé el flutter y flutter clean, luego la aplicación funciona
Lav Kushwaha
1
Cambiar al canal maestro y actualizar el aleteo resolverá el problema. Gracias +1 por ti.
Vinoth Vino
1
Es una mala idea cambiar a la rama maestra. La rama maestra es la más inestable entre todas. Quien busque una mejor solución debería considerar otras respuestas para esta pregunta. github.com/flutter/flutter/wiki/Flutter-build-release-channels
fotonmoton
1
debería estar flutter cleanen minúsculas si alguien puede editarlo
Dimitar
1
@Dimitar No me di cuenta de que era mayúscula, lo acabo de editar, gracias por hacérnoslo saber,
Yousef Gamal
7

También tuve el mismo problema y el uso flutter cleanno lo resolvió para mí ( flutter versión 1.12.13 + hotfix 8 )

Pero luego, agregar una clave única al widget (no a su estado) resolvió el problema para mí.

muestra mínima de código de trabajo para demostrar esto.

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
fuente
Gracias Eyad, agregar claves ayudó a resolver el problema
Charden Daxicen
Hasta el lanzamiento de Flutter 1.17 estable, creo que esta es la respuesta correcta para un proyecto en producción
Pablo Insua
¿Puedes explicar por qué no usamos una clave GoogleMap()?
Shahzad Akram
4

De acuerdo con la API ,

No cambie la cámara con esta actualización de la cámara hasta que el mapa haya sido diseñado (para que este método determine correctamente el cuadro delimitador y el nivel de zoom adecuados, el mapa debe tener un tamaño). De lo contrario, se lanzará una IllegalStateException.

Tuve el mismo problema y después de algunas depuraciones, parece que cada vez que vuelve a cargar mientras el mapa está a la vista, dará el error.

Pero puede evitar el error si vuelve a cargar en caliente después de desechar el mapa.

En otras palabras, está allí para evitar que varias instancias de mapas estén activas.

Por lo tanto, sugeriría deshacerse del mapa antes de la recarga en caliente mientras está en desarrollo.

En una versión de producción, los usuarios no podrán recargar en caliente, por lo tanto, no encontrarán el problema de la plataforma.

Steve Kim
fuente
3

El problema se debe al uso del mismo controlador en varios widgets de GoogleMaps. Cree solo un widget de GoogleMap y use el objeto GoogleMapController para realizar cualquier cambio.

Nihal Ismail
fuente