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 -0800
    • Engine 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/Sdk
    • Android NDK location not configured (optional; useful for native profiling support)
    • Platform android-29, build-tools 29.0.2
    • Java 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.1
    • Dart plugin version 191.8593
    • Java version OpenJDK Runtime Environment (build 1.8.0_202-release-1483-b49-5587405)

[✓] Connected device (1 available)
    • vivo 1723 • 49269ad3 • 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.