Flutter Google Maps, tentando di creare una vista piattaforma già creata, visualizza id: 0


17

Per la prima volta Google Flutter si carica, perfetto ma quando riavvia a caldo, va all'eccezione della piattaforma

google_maps_flutter: ^ 0.5.21 + 15

Github [google_maps_flutter] Tentativo di creare una vista piattaforma già creata # 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!

Risposte:


7

Per risolvere questo problema ho fatto quanto segue tramite il terminale:

1- Modificato il ramo nel ramo Master:

flutter channel master

2- Flutter aggiornato

flutter upgrade

3- Pulito il codice:

flutter clean


1
sì, ho fatto lo stesso e il hot ricaricamento ora funziona, cambiato in master branch, aggiorna il flutter e il flutter pulito, quindi l'app funziona
Lav Kushwaha,

1
Passare al canale principale e aggiornare il flutter risolverà il problema. Grazie +1 per te.
Vinoth Vino,

1
È una cattiva idea passare al ramo principale. Il ramo principale è il più instabile tra tutti. Chiunque cerchi una soluzione migliore dovrebbe prendere in considerazione un'altra risposta a questa domanda. github.com/flutter/flutter/wiki/Flutter-build-release-channels
fotonmoton

1
dovrebbe essere flutter cleancon lettere minuscole se qualcuno può modificarlo
Dimitar

1
@Dimitar Non ho notato che era in maiuscolo, l'ho appena modificato, grazie per averci fatto sapere,
Yousef Gamal

7

Ho anche avuto lo stesso problema e l'utilizzo flutter cleannon l'ha risolto per me ( versione flutter 1.12.13 + hotfix 8 )

Ma poi, l' aggiunta di una chiave univoca al widget (non al suo stato) ha risolto il problema per me.

esempio minimo di codice di lavoro per dimostrarlo.

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

Grazie Eyad, l'aggiunta di chiavi ha aiutato a risolvere il problema
Charden Daxicen l'

Fino al rilascio di Flutter 1.17 stabile, penso che questa sia la risposta corretta per un progetto in produzione
Pablo Insua,

Puoi spiegarlo perché non usiamo una chiave GoogleMap()?
Shahzad Akram,

4

Secondo l' API ,

Non cambiare la fotocamera con questo aggiornamento della fotocamera fino a quando la mappa non ha subito il layout (affinché questo metodo determini correttamente il riquadro di delimitazione e il livello di zoom appropriati, la mappa deve avere una dimensione). In caso contrario verrà generata un'eccezione IllegalStateException.

Ho avuto lo stesso problema e dopo un po 'di debug, sembra che ogni volta che si aggiorna a caldo mentre la mappa è in vista, darà l'errore.

Ma puoi prevenire l'errore se ricarichi a caldo dopo aver eliminato la mappa.

In altre parole, è lì per impedire che più istanze di mappe siano attive.

Quindi suggerirei di smaltire la mappa prima di ricaricare a caldo durante lo sviluppo.

In una versione di produzione, gli utenti non saranno in grado di ricaricare a caldo in questo modo, non incontreranno il problema della piattaforma.


3

Il problema è dovuto all'uso dello stesso controller in più widget GoogleMaps. Crea un solo widget GoogleMap e utilizza l'oggetto GoogleMapController per apportare eventuali modifiche.


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.